矩阵相乘
今天又是闲来无事的一天,在网上又看到了这道矩阵相乘的题。不知道为什么,可能是高数学太久忘了,就想把这道题写下来。记录一下高数知识。
题目描述
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
输入
第一行是一个正整数N、M(1< =N< =30, 0< =M< =5),表示矩阵A的阶数和要求的幂数
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
输出
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
一开始我就懵了,并不知道结果怎么来的。所以查了一下资料。以下是对矩阵相乘的介绍。
设A为 m x p 的矩阵,B为 p x n 的矩阵,那么称 m x n 的矩阵C为矩阵A与B的乘积,记作,其中矩阵C中的第 i 行第 j 列元素可以表示为:
如下所示:
以上就是矩阵相乘介绍。主要注意的一点就是相乘结果的第 i 行第 j 列是由原第一个矩阵的第 i 行与原第二个矩阵的第 j 列一一对应相乘所得结果。知道这个思想,就能写出代码了。
c++代码如下
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int N,M;
int a[31][31],b[31][31],c[31][31];
cin >> N >> M;
for(int i = 1; i <= N; i ++)
{
for(int j = 1; j <= N; j ++)
{
scanf("%d",&a[i][j]);
b[i][j] = a[i][j];
}
}
for(int i = 1; i < M; i ++)
{
int j = 1,k = 1;
while(j <= N)
{
int toc = 0;
for(int m = 1; m <= N; m ++)
toc += a[j][m] * b[m][k];
c[j][k] = toc;
k ++;
if(k == N + 1)
{
j ++;
k = 1;
}
}
for(int m = 1; m <= N; m ++)
for(int n = 1; n <= N; n ++)
b[m][n] = c[m][n];
}
//矩阵的零次方是单位矩阵
if(M == 0)
{
for(int i = 1; i <= N; i ++)
for(int j = 1; j <= N; j ++)
{
if(i == j)
b[i][j] = 1;
else
b[i][j] = 0;
}
}
for(int i = 1; i <= N; i ++)
{
for(int j = 1; j <= N; j ++)
{
cout << b[i][j] << " ";
}
cout << endl;
}
return 0;
}
知道上面这些后,写出代码并不能全过。是因为题目中出现了矩阵的0次幂,而矩阵的零次幂是单位矩阵,
我又查了下单位矩阵的特点,它们都是对角线坐标为1,其他坐标为0。所以在把这点加入代码,就能通过全部测试点了。