基础知识:(会基础的直接看应用部分)

(1)矩阵乘法

简单的说矩阵就是二维数组,数存在里面,矩阵乘法的规则:A*B=C

其中c[i][j]为A的第i行与B的第j列对应乘积的和,即:

代码

const int N=100;

int c[N][N];

void multi(int a[][N],int b[][N],int n)

//n是矩阵大小,n

{

memset(c,0,sizeof c);

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

for(int k=1;k<=n;k++)

c[i][j]+=a[i][k]*b[k][j];

}

显然矩阵乘法的复杂度是O(n^3);

这里我直接写的是n*n的矩阵(即方阵),显然两个相乘是要一行和一列对应乘,那么矩阵乘法是需要A的行数与B的列数相等的(这是A*B的前提条件,可见矩阵的乘法是不满足交换律的)。然而这些一般都是没什么用的,矩阵快速幂只会用到方阵(除非题目是裸的矩阵乘法)。矩阵快速幂都是方阵也就避免的相乘的前提条件,可以放心用。

(2)矩阵快速幂

就是算A^n;方法很简单,把快速幂算法中的乘法改成矩阵的乘法就可以了(快速幂的方法以前写过,欢迎找以前文章,核心思想是:就是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。)

代码:

struct mat

{

ll m[maxn][maxn];

}unit;

void init()

{

for(int i=1;i

unit.m[i][i]=1;

}

mat matmul(mat a,mat b)

{

mat ans;

ll tmp =0;

for(int i=1;i

{

for(int j=1;j

{

tmp=0;

for(int k=1;k

{

tmp=(tmp+a.m[i][k]*b.m[k][j])%mod;

}

ans.m[i][j]=tmp;

}

}

return ans;

}

mat fastPow(mat a,long ong n)

{

mat tmp = a;

mat res=unit;

while(n)

{

if(n&1)

res=matmul(res,tmp);

tmp = matmul(tmp,tmp);

n>>=1;

}

return res;

}

应用

主要通过把数放到矩阵的不同位置,然后把普通递推式变成"矩阵的等比数列",最后快速幂求解递推式

先通过入门的题目来讲应用矩阵快速幂的套路

矩阵快速幂是用来求解递推式的,所以第一步先要列出递推式:

f(n)=f(n-1)+f(n-2)

第二步是建立矩阵递推式,找到转移矩阵:

进一步递推

这里就是个矩阵乘法等式左边:1*f(n-1)+1*f(n-2)=f(n);1*f(n-1)+0*f(n-2)=f(n-1);

这里还是说一下构建矩阵递推的大致套路,一般An与A(n-1)都是按照原始递推式来构建的,当然可以先猜一个An,主要是利用矩阵乘法凑出矩阵T,第一行一般就是递推式,后面的行就是不需要的项就让与其的相乘系数为0。矩阵T就叫做转移矩阵(一定要是常数矩阵),它能把A(n-1)转移到A(n);然后这就是个等比数列,直接写出通项:

此处A1叫初始矩阵。所以用一下矩阵快速幂然后乘上初始矩阵就能得到An,这里An就两个元素(两个位置),根据自己设置的A(n)对应位置就是对应的值,按照上面矩阵快速幂写法,res[1][1]=f(n)就是我们要求的。

扫码关注我们

微信号|凌云网络实验室

图文  |  丁晓鸣

审核  |  米玉秋

利用openmp实现矩阵相乘_矩阵快速幂相关推荐

  1. pytorch 矩阵相乘_深入浅出PyTorch(算子篇)

    Tensor 自从张量(Tensor)计算这个概念出现后,神经网络的算法就可以看作是一系列的张量计算.所谓的张量,它原本是个数学概念,表示各种向量或者数值之间的关系.PyTorch的张量(torch. ...

  2. python numpy常用操作、Numpy 多维数组、矩阵相乘、矩阵乘以向量

    python numpy常用操作 Numpy基本操作 # 导入numpy import numpy as np # 生成numpy数组 x = np.array([1.0, 2.0, 3.0]) pr ...

  3. pytorch 矩阵相乘_编译PyTorch静态库

    背景 众所周知,PyTorch项目作为一个C++工程,是基于CMake进行构建的.然而当你想基于CMake来构建PyTorch静态库时,你会发现: 静态编译相关的文档不全: CMake文件bug太多, ...

  4. matlab非同秩矩阵相乘_线性代数精华——讲透矩阵的初等变换与矩阵的秩

    这篇文章和大家聊聊矩阵的初等变换和矩阵的秩. 矩阵的初等变换这个概念可能在很多人听来有些陌生,但其实我们早在初中的解多元方程组的时候就用过它.只不过在课本当中,这种方法叫做消元法.我们先来看一个课本里 ...

  5. pytorch 矩阵相乘_深度学习 — — PyTorch入门(三)

    点击关注我哦 autograd和动态计算图可以说是pytorch中非常核心的部分,我们在之前的文章中提到:autograd其实就是反向求偏导的过程,而在求偏导的过程中,链式求导法则和雅克比矩阵是其实现 ...

  6. 矩阵的乘法和快速幂的一些理解(适用初学者)

    矩阵是线性代数的知识...后悔没好好学了... 第一部分:矩阵的基础知识 1.结合性 (AB)C=A(BC). 2.对加法的分配性 (A+B)C=AC+BC,C(A+B)=CA+CB . 3.对数乘的 ...

  7. C/C++ 实现二维数组的矩阵相乘和矩阵相加

    C++实现矩阵相乘和相加运算 这里只实现了N * N矩阵的相加和相乘,如果想要实现N*M 和 M*S矩阵相乘,得到N*S矩阵,只需要将乘法的i,j改成N和S的值,k对应的是M的值 #include & ...

  8. 低秩矩阵完备_矩阵之芯 SVD: 基本应用以及与其他分解的关系

    上一篇里忘记说了,为什么取名为矩阵之芯呢? 矩阵之芯 SVD: 奇异值分解及其几何解释除了这东西在线性代数里确实比较重要外,从长相看,是不是有点上面图片里的那家伙的身形.矩阵的奇异值分解 ,一分为仨, ...

  9. mysql 矩阵乘法_矩阵乘法高级操作

    对于矩阵乘法的一些操作 我们 其实 大部分是 多追加一个系数 或者和 其他算法连在一起. 至于核心无非就是 先列出dp 方程再优化 或者 直接 对题目进行建模 构建矩阵. 至于矩阵乘法的正确性 形状的 ...

  10. python3两个三阶矩阵相乘_两个三阶矩阵相乘的例子和方法!急!

    展开全部 给定三阶方阵A:A={{a,b,c},{d,e,f},{p,q,r}},把第一e69da5e887aa62616964757a686964616f31333433633532行的第一个数字变 ...

最新文章

  1. XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件
  2. 脑电分析系列[MNE-Python-19]| 可视化Evoked数据
  3. python分支结构使用if保留字吗_关于Python分支结构,以下选项中描述不正确的是...
  4. matlab公共函数之保存YUV数据
  5. 使用sqoop将HIVE中的数据输出带Mysql中
  6. 探索Julia(part10)--自定义函数
  7. 解决点击事件让背景变红,在点击背景变正常,并且可以多选的效果
  8. python调用高德地图api 可视化_Python:利用高德地图API实现找房
  9. python遇到的问题-Python常见问题
  10. Maxwell与Canal 工具对比
  11. Springboot(java)程序部署到k8s
  12. 推荐牛X的一本JS书
  13. Python入门:使用turtle库 绘制时钟(经典画表)
  14. 麦克风阵列技术(转载)
  15. 谈谈我对Spring Bean 生命周期的理解
  16. 【图像分类】ResNet网络结构
  17. hdu2825(AC 自动机)
  18. 人民搜索2013年招聘的三道算法题 西安站
  19. 3、一层、二层、交换机原理、Cisco软件及命令
  20. 【研究生论文写作】 思政相关题目选择题

热门文章

  1. 20165223 《JAVA程序设计》第三周学习总结
  2. c++11 多线程依次打印ABC
  3. 数组及引用类型内存分配
  4. 等待事件之日志等待事件解决的方法
  5. jQuery 集合 搜索操作(父辈元素搜索、同辈元素搜索、子元素搜索)
  6. 在 Nvidia 显卡下设置装备铺排双浮现器
  7. Mysql数据库和表的操作
  8. 线程间的通信之wait和notify的使用
  9. Oracle查询优化改写技巧与案例总结三
  10. Python Django 之 jQuery