1 / 2
文档名称:

矩阵乘法算法.doc

格式:doc   大小:25KB   页数:2页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

矩阵乘法算法.doc

上传人:taoapp 2022/2/25 文件大小:25 KB

下载得到文件列表

矩阵乘法算法.doc

文档介绍

文档介绍:矩阵乘法算法
分类: 收藏学****笔记2010-08-03 19:511318人阅读评论(2)收藏举报
矩阵运算是属于线性代数里的一个重要内容,上学期学完后只觉得矩阵能解线性方程,不过高中的时候听说过矩阵能优化常系数递推以及将坐标上的点作线矩阵乘法算法
分类: 收藏学****笔记2010-08-03 19:511318人阅读评论(2)收藏举报
矩阵运算是属于线性代数里的一个重要内容,上学期学完后只觉得矩阵能解线性方程,不过高中的时候听说过矩阵能优化常系数递推以及将坐标上的点作线性变换,于是找了些资料研究了一下,并把许多经典题以及HDU shǎ崽大牛总结的矩阵乘法的题目[1]、[2]和开设的矩阵乘法DIY Contest给做完了,感觉收获颇丰。
一个矩阵就是一个二维数组,为了方便声明多个矩阵,我们一般会将矩阵封装一个类或定义一个矩阵的结构体,我采用的是后者:
struct Mat
{
int mat[Max][Max];
}
最特殊的矩阵应该就是单位矩阵E了,它的对角线的元素为1,非对角线元素为0。
一般矩阵乘法采用朴素的O(n^3)的算法:
Mat operator*(Mat a,Mat b)
{
int i,j,k;
Mat c;
for (i=0;i<len;i++)
{
for (j=0;j<len;j++)
{
[i][j] = 0;
for(k=0;k<len;k++)
[i][j]+=([i][k]*[k][j])%MOD;
}
}
return c;
}
矩阵加法就是简单地将对应的位置的两个矩阵的元素相加:
Mat operator+(Mat a,Mat b)
{
Mat c;
int i,j;
for (i=0;i<len;i++)
{
for(j=0;j<len;j++)
[i][j] = ([i][j]+[i][j])%MOD;
}
return c;
}
在ACM的题目中,我们一般考虑的是n阶方阵之间的乘法以及n阶方阵与n维向量(把向量看成n×1的矩阵)的乘法。矩阵乘法最重要的性质就是满足结合律,同时它另一个很重要的性质就是不满足交换率,这保证了矩阵的幂运算满足快速幂取模(A^x % MOD)算法:
假设k = 27,则k的二进制表示为11011,所以
,可以看出:k的二进制的每一位矩阵A都要平方,在k二进制为1的位:末矩阵×平方后的A,在k二进制为0的位则末矩阵×E(单位矩阵),即不变。代码如下:
Mat operator^(Mat a,int x)
{
Mat p = e,q = a;
while (x)
{