矩阵快速幂模板

今天学习了一下小红书上的矩阵快速幂 

以为他写的那么短会写的多么高大上

原来只是把运算符重载了一下

 先定义矩阵数据结构:  

struct Mat {
double mat[N][N];
};

  O(N^3)实现一次矩阵乘法

复制代码
Mat operator * (Mat a, Mat b) {
Mat c;
memset(c.mat, 0, sizeof(c.mat));
int i, j, k;
for(k = 0; k < n; ++k) {
for(i = 0; i < n; ++i) {
if(a.mat[i][k] <= 0) continue; //不要小看这里的剪枝,cpu运算乘法的效率并不是想像的那么理想(加法的运算效率高于乘法,比如Strassen矩阵乘法)
for(j = 0; j < n; ++j) {
if(b.mat[k][j] <= 0) continue; //剪枝
c.mat[i][j] += a.mat[i][k] * b.mat[k][j];
}
}
}
return c;
}
复制代码

 

有了前边的介绍,就可以实现矩阵的快速连乘了。

复制代码
Mat operator ^ (Mat a, int k) {
Mat c;
int i, j;
for(i = 0; i < n; ++i)
for(j = 0; j < n; ++j)
c.mat[i][j] = (i == j); //初始化为单位矩阵

for(; k; k >>= 1) {
if(k&1) c = c*a;

a = a*a;
}
return c;
}
复制代码

 

posted @ 2014-11-07 21:04  悠悠我心。  阅读(156)  评论(0编辑  收藏  举报