1.普通乘法
当且仅当方阵A行等于方阵B列时才可以进行矩阵乘法运算。
#include <iostream>
using namespace std;
int a[300][300];
int b[300][300];
int ans[300][300];
int main()
{
int m,s,n;
cin>>m>>s>>n;
for(int i = 0;i < m; i++)
for(int j = 0;j < s; j++)
cin>>a[i][j];
for(int i = 0;i < s; i++)
for(int j = 0;j < n; j++)
cin>>b[i][j];
for(int i = 0;i < m; i++)
{
for(int j = 0;j < n; j++)
{
int tmp = 0;
for(int k = 0;k < s; k++)
{
tmp += a[i][k] * b[k][j]; //核心算法
}
ans[i][j] = tmp;
}
}
for(int i = 0; i < m; i++)
{
for(int j = 0;j < n; j++)
{
cout<<ans[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
2.方幂乘法
只有方阵才可以进行幂运算
1·朴素算法
#include <iostream>
using namespace std;
int a[1010][1010] = {0};
int b[1010][1010] = {0};
int ans[1010][1010] = {0};
int n,m;
int main()
{
cin>>n>>m;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin>>a[i][j];
if(m == 0)
{
for(int i = 0;i < n; i++)
{
for(int j = 0;j < n; j++)
{
if(i == j)
cout<<1<<' '; //1000
else //0100
cout<<0<<' '; //0010
} //0001
cout<<endl;
}
return 0;
}
if(m == 1)
{
for(int i = 0;i < n; i++)
{
for(int j = 0; j < n; j++)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
m--;
int flag = 0;
while(m--)
{
if(!flag)
memcpy(b,a,sizeof(a));
else
memcpy(b,ans,sizeof(a));
for(int i = 0;i < n; i++)
{
for(int j = 0; j < n; j++)
{
int tmp = 0;
for(int k = 0; k < n; k++)
{
tmp += a[i][k] * b[k][j];//核心计算
ans[i][j] = tmp;
}
}
}
flag = 1;
}
for(int i = 0; i < n; i++)
{
for(int j = 0;j < n; j++)
{
cout<<ans[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
2·快速幂
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 110;
const int MOD = 1e9 + 7;
typedef long long ll;
struct mat //构建矩阵结构体
{
ll arr[MAXN][MAXN];
void reset() //重置为E矩阵
{
for(int i = 0; i < MAXN; i++)
{
arr[i][i] = 1;
}
}
};
mat mul(mat x, mat y, int n) //乘法运算
{
mat ans;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
ans.arr[i][j] = 0;
for(int k = 0; k < n; k++)
{
ans.arr[i][j] += (x.arr[i][k] * y.arr[k][j]) % MOD;
}
ans.arr[i][j] %= MOD;
}
}
return ans;
}
mat qpow(mat a, int m, int n) //快速幂
{
mat ans;
ans.reset();
while(m)
{
if(m & 1)
ans = mul(ans, a, n);
a = mul(a, a, n);
m /= 2;
}
return ans;
}
int main()
{
mat a;
int n, m; //n为方阵维数, m为幂次数
cin>>n>>m;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin>>a.arr[i][j];
}
}
mat ans = qpow(a, m, n);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cout<<ans.arr[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
模板