矩阵构造方法与矩阵乘法
来源:互联网 发布:证券投资软件 编辑:程序博客网 时间:2024/06/05 07:17
矩阵乘法(百度百科)
矩阵乘法满足结合率,但不满足交换率
一般的矩乘要结合快速幂才有效果``
矩阵构造方法
此部分转载于: http://www.cnblogs.com/frog112111/archive/2013/05/19/3087648.html
Fibonacci数列:F(0)=1 , F(1)=1 , F(n)=F(n-1)+F(n-2)
我们以前快速求Fibonacci数列第n项的方法是 构造常系数矩阵
Fibonacci数列:F(0)=1 , F(1)=1 , F(n)=F(n-1)+F(n-2)
我们以前快速求Fibonacci数列第n项的方法是 构造常系数矩阵
(一) Fibonacci数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的第n项快速求法(不考虑高精度)
解法:
考虑1×2的矩阵【f[n-2],f[n-1]】。根据Fibonacci数列的递推关系,我们可以通过乘以一个2×2的矩阵A,得到矩阵:【f[n1],f[n]】。
即:【f[n-2],f[n-1]】*A = 【f[n-1],f[n]】=【f[n-1],f[n-1]+f[n-2]】
很容易构造出这个2×2矩阵A,即:
0 1
1 1
所以,有【f[1],f[2]】×A=【f[2],f[3]】又因为矩阵乘法满足结合律,故有:
【f[1],f[2]】×A ^(n-1) =【f[n],f[n+1]】
这个矩阵的第一个元素f[n]即为所求。
(二) 数列f[n]=f[n-1]+f[n-2]+1,f[1]=f[2]=1的第n项的快速求法(不考虑高精度)
解法:仿照前例,考虑1×3的矩阵【f[n-2],f[n-1],1】,希望求得某3×3的矩阵A,使得此1×3的矩阵乘以A得到矩阵:【f[n-1],f[n],1】
即:【f[n-2],f[n-1],1】* A =【f[n-1],f[n],1】=【f[n-1],f[n-1]+f[n-2]+1,1】
容易构造出这个3×3的矩阵A,即:
0 1 0
1 1 0
0 1 1
故:【f[1],f[2],1】* A^(n-1) = 【f[n],f[n+1],1】
(三)数列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的第n项的快速求法(不考虑高精度).
解法:仿照前例,考虑1×4的矩阵【f[n-2],f[n-1],n,1】,希望求得某4×4的矩阵A,使得此1×4的矩阵乘以A得到矩阵:【f[n-1],f[n],n+1,1】
即:【f[n-2],f[n-1],n,1】* A = 【f[n-1],f[n],n+1,1】=【f[n-1],f[n-1]+f[n-2]+n+1,n+1,1】
容易构造出这个4×4的矩阵A,即:
0 1 0 0
1 1 0 0
0 1 1 0
0 1 1 1
故:【f[1],f[2],3,1】* A^(n-1) = 【f[n],f[n+1],n+2,1】
(四) 数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的前n项和s[n]=f[1]+f[2]+……+f[n]的快速求法(不考虑高精度).
解法:仿照之前的思路,考虑1×3的矩阵【f[n-2],f[n-1],s[n-2]】,我们希望通过乘以一个3×3的矩阵A,得到1×3的矩阵:【f[n-1],f[n],s[n-1]】
即:【f[n-2],f[n-1],s[n-2]】 * A = 【f[n-1],f[n],s[n-1]】=【f[n-1],f[n-1]+f[n-2],s[n-2]+f[n-1]】
容易得到这个3×3的矩阵A是:
0 1 0
1 1 1
0 0 1
这种方法的矩阵规模是(r+1)*(r+1)
f(1)=f(2)=s(1)=1 ,所以,有
【f(1),f(2),s(1)】* A = 【f(2),f(3),s(2)】
故:【f(1),f(2),s(1)】* A^(n-1) = 【f(n),f(n+1),s(n)】
(五) 数列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的前n项和s[n]=f[1]+f[2]+……+f[n]的快速求法(不考虑高精度).
解法:考虑1×5的矩阵【f[n-2],f[n-1],s[n-2],n,1】,我们需要找到一个5×5的矩阵A,使得它乘以A得到如下1×5的矩阵【f[n-1],f[n],s[n-1],n+1,1】
即:【f[n-2],f[n-1],s[n-2],n,1】* A =【f[n-1],f[n],s[n-1],n+1,1】
=【f[n-1], f[n-1]+f[n-2]+n+1,s[n-2]+f[n-1],n+1,1】
容易构造出A为:
0 1 0 0 0
1 1 1 0 0
0 0 1 0 0
0 1 0 1 0
0 1 0 1 1
故:【f(1),f(2),s(1),3,1】* A^(n-1) = 【f(n),f(n+1),s(n),n+2,1】
一般地,如果有f[n]=p*f[n-1]+q*f[n-2]+r*n+s可以构造矩阵A为:
0 q 0 0 0
1 p 1 0 0
0 0 1 0 0
0 r 0 1 0
0 s 0 1 1
矩阵乘法
经典题目1
给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置。操作有平移、缩放、翻转和旋转
这里的操作是对所有点同时进行的。其中翻转是以坐标轴为对称轴进行翻转(两种情况),旋转则以原点为中心。如果对每个点分别进行模拟,那么m个操作总共耗时O(mn)。利用矩阵乘法可以在O(m)的时间里把所有操作合并为一个矩阵,然后每个点与该矩阵相乘即可直接得出最终该点的位置,总共耗时O(m+n)。假设初始时某个点的坐标为x和y,下面5个矩阵可以分别对其进行平移、旋转、翻转和旋转操作。预先把所有m个操作所对应的矩阵全部乘起来,再乘以(x,y,1),即可一步得出最终点的位置。
经典题目2
给定矩阵A,请快速计算出A^n(n个A相乘)的结果,输出的每个数都mod p。
由于矩阵乘法具有结合律,因此A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。我们可以得到这样的结论:当n为偶数时,A^n = A^(n/2) * A^(n/2);当n为奇数时,A^n = A^(n/2) * A^(n/2) * A (其中n/2取整)。这就告诉我们,计算A^n也可以使用二分快速求幂的方法。例如,为了算出A^25的值,我们只需要递归地计算出A^12、A^6、A^3的值即可。根据这里的一些结果,我们可以在计算过程中不断取模,避免高精度运算。
还有其他的题目具体见:
http://www.cnblogs.com/DreamUp/archive/2010/07/27/1786225.html
关于矩阵典型例题
http://www.cnblogs.com/frog112111/archive/2013/05/16/3082416.html
- 矩阵构造方法与矩阵乘法
- [矩阵乘法 + 矩阵构造] HDU 2971 Tower
- HDU5950Recursive sequence(构造矩阵+矩阵乘法)
- POJ 3735 构造矩阵乘法
- POJ 3420 构造矩阵乘法
- POJ 1977 构造矩阵乘法
- 矩阵乘法与应用
- 矩阵乘法与运用
- 浅谈矩阵乘法与矩阵二次型
- 矩阵分块与矩阵乘法的理解
- 矩阵构造方法
- 矩阵构造方法
- 矩阵构造方法
- 矩阵构造方法
- 矩阵的构造方法
- GLSL方法 构造矩阵
- 矩阵构造方法
- 矩阵的构造方法
- HDU 5170 GTY's math problem
- 2015年学习计划
- Problem 040——UVa 11988 - Broken Keyboard (a.k.a. Beiju Text)
- 关于openssl的一些知识
- Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)
- 矩阵构造方法与矩阵乘法
- PHP WAMPServver集成环境下载和安装
- 蓝桥杯:高精度加法
- [Mark] Unity3d之 汽车物理系统
- window.location 方法集
- glibc 2.21 发布,安全修复和性能提升
- Sqlite如何修改表结构
- 冬日里的C++
- HTML特殊字符编码对照表