我是靠谱客的博主 知性大神,最近开发中收集的这篇文章主要介绍循环矩阵求幂,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

循环矩阵

它的行向量的每个元素都是前一个行向量各元素依次右移一个位置得到的结果。

例如:

b=

[1, 1, 0, 0, 1]

[1, 1, 1, 0, 0]

[0, 1, 1, 1, 0]

[0, 0, 1, 1, 1]

[1, 0, 0, 1, 1]


对于循环矩阵的求幂,可以用普通的方法,但是效率很低。看下面的例子:

b^1 =

[1, 1, 0, 0, 1]

[1, 1, 1, 0, 0]

[0, 1, 1, 1, 0]

[0, 0, 1, 1, 1]

[1, 0, 0, 1, 1]

b^2 =

[3, 2, 1, 1, 2]

[2, 3, 2, 1, 1]

[1, 2, 3, 2, 1]

[1, 1, 2, 3, 2]

[2, 1, 1, 2, 3]

b^3 =

[7, 6, 4, 4, 6]

[6, 7, 6, 4, 4]

[4, 6, 7, 6, 4]

[4, 4, 6, 7, 6]

[6, 4, 4, 6, 7]

b^4 =

[19, 17, 14, 14, 17]

[17, 19, 17, 14, 14]

[14, 17, 19, 17, 14]

[14, 14, 17, 19, 17]

[17, 14, 14, 17, 19]

 

可以发现,就是无论是b的几次幂,都符合A[i][j] = A[i-1][j-1]

高手说是这样推倒出来地:

######

利用矩阵A,B具有a[i][j]=A[i-1][j-1],B[i][j]=B[i-1][j-1](i-1<0则表示i-1+n,j-1<0则表示j-1+n)

我们可以得出矩阵C=a*b也具有这个性质

C[i][j]=sum(A[i][t]*B[t][j])=sum(A[i-1][t-1],B[t-1][j-1])=sum(A[i-1][t],B[t][j-1])=C[i-1][j-1] 


所以,可以只求第一行的积,其他行由第一行循环得到。在纸上写一下矩阵行列式相乘的情况,可以得到这样的函数:

void mul(int a[],int b[])  
{  
      int i,j;  
      int c[501];  
      for(i=0;i<n;++i)for(c[i]=j=0;j<n;++j)c[i]+=a[j]*b[i>=j?(i-j):(n+i-j)];  
      for(i=0;i<n;b[i]=c[i++]);                       
}

b数组保存的就是新得到的第一行的值。



最后

以上就是知性大神为你收集整理的循环矩阵求幂的全部内容,希望文章能够帮你解决循环矩阵求幂所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部