书山有径勤为路>>>>>>>>

<<<<<<<<学海无涯苦作舟!

矩阵相乘的算法

问题:求矩阵相乘后的和。

一、最基本的算法

下面给出一个例子来说明一下矩阵是如何相乘的。

矩阵A为   1  0  2

             3  5  6

矩阵B为  3  1

            2  2

            1  3

C=A*B =  1*3+0*2+2*1  1*1+0*2+2*3

               3*3+5*2+6*1  3*1+5*2+6*3

最简单的算法就是用3个for循环就可以搞定了。

假设A有ArowNum行, AvolBrow列。

B必有AvolBrow行,假设B有BvolNum列。

则循环如下:

    for(int i=0; i<ArowNum; i++)
for(int j=0; j<BvolNum; j++)
for(int k=0; k<AvolBrow; k++)
C[i][j] += A[i][k]*B[k][j];
    这个是矩阵相乘的例子。

 

    for(int i=0; i<ArowNum; i++)
for(int j=0; j<BvolNum; j++)
for(int k=0; k<AvolBrow; k++)
sum += A[i][k]*B[k][j];
这个是矩阵相乘后求和的例子。



二、发现规律,提高效率

还是上面的那个例子。

矩阵A为   1  0  2

             3  5  6

矩阵B为  3  1

            2  2

            1  3

C=A*B =  1*3+0*2+2*1  1*1+0*2+2*3

               3*3+5*2+6*1  3*1+5*2+6*3

我们来观察一下C中的每个式子中A元素的列坐标和B元素的行坐标。

1(v:0)*3(r:0)+0(v:1)*2(r:1)+2(v:2)*1(r:2)——1式

1(v:0)*1(r:0)+0(v:1)*2(r:1)+2(v:2)*3(r:2)——2式

3(v:0)*3(r:0)+5(v:1)*2(r:1)+6(v:2)*1(r:2)——3式

3(v:0)*1(r:0)+5(v:1)*2(r:1)+6(v:2)*3(r:2)——4式

 

1式与2式结合:1(v:0)*(3+1)+0(v:1)*(2+2)+2(v:2)*(1+3)——5式

3式与4式结合:3(v:0)*(3+1)+5(v:1)*(2+2)+6(v:2)*(1+3)——6式

 

5式与6式结合:(1+3)*(3+1)+(0+5)*(2+2)+(2+6)*(1+3)——7式

 

从7式可以看出:1+3 0+5 2+6是将A中的元素以列相加

                     3+1 2+2 1+3是将B中的元素以行相加

 

具体的代码已经很明显了,就不在写出了。

很明显这个是两重循环,所以效率大大提高了。

posted on 2011-11-27 11:21  More study needed.  阅读(1696)  评论(0编辑  收藏  举报

导航

书山有径勤为路>>>>>>>>

<<<<<<<<学海无涯苦作舟!