矩阵相乘的算法

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

一、最基本的算法

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

矩阵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中的元素以行相加

 

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

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

转载于:https://www.cnblogs.com/o8le/archive/2011/11/27/2264904.html

  • 16
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值