循环矩阵乘
Posted milk-feng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环矩阵乘相关的知识,希望对你有一定的参考价值。
仅供个人查看,没有验证其正确性。
循环矩阵快速幂是可以通过一个一维数组来完成的。(我之前一直用二维数组,比较好理解)
比如说一个$5 \\times 5$的循环矩阵,再乘一个$5 \\times 5$的矩阵,
$\\times$ $=$
第一个用数组$a$表示,第二个用数组$b$表示,第三个用数组$c$表示,
那么我们把$a$和$b$相乘得到的$c$仍然是循环矩阵。
把所有情况都列出来:
根据矩阵乘定义:$c[1]=a[1][1]*b[1][1]+a[1][2]*b[2][1]+a[1][3]*b[3][1]+a[1][4]*b[4][1]+a[1][5]*b[5][1]$,
根据上面的图,把它们都编号($"\\times"$前边的是$a$,后边的是$b$),那么:
$c[1]=1\\times 1+2\\times 5+3\\times 4+4\\times 3+5\\times 2$,
$c[2]=1\\times 2+2\\times 1+3\\times 5+4\\times 4+5\\times 3$
$c[3]=1\\times 3+2\\times 2+3\\times 1+4\\times 5+5\\times 4$
$c[4]=1\\times 4+2\\times 3+3\\times 2+4\\times 1+5\\times 5$
$c[5]=1\\times 5+2\\times 4+3\\times 3+4\\times 2+5\\times 1$
这样就发现规律了吧,这东西也是循环的,$c[i]=\\sum \\limits_j=1^n a[j]\\times b[(i-j+n)\\% n+1]$。
这样就能开一维数组存了。
丑陋的伪代码:
for(Reg int i=1;i<=n;++i) for(Reg int j=1;j<=n;++j) c[i]+=a[j]*b[(i-j+n)%n+1];
以上是关于循环矩阵乘的主要内容,如果未能解决你的问题,请参考以下文章