当前位置:网站首页>矩阵乘法总结
矩阵乘法总结
2022-08-09 00:05:00 【Bold!】
传送门,这个讲得太好了吧!!!
矩阵乘法:
满足结合律和分配律,但是不满足交换律(因为乘出来的矩阵为左行右列)
1.简单的A*B矩阵
c(i,j) = sum a[i][k]*b[k][j];
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 110;
int a[N][N],b[N][N],c[N][N];
void solve(){
int n,m,p;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
cin>>p;
for(int i=1;i<=m;i++){
for(int j=1;j<=p;j++){
cin>>b[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=p;j++){
for(int k=1;k<=m;k++){
//共同的是左矩阵的列等于右矩阵的行,放最后
c[i][j]+=a[i][k]*b[k][j];//累加,最后得到的新矩阵的行和列分别等于左矩阵的行和右矩阵的列
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=p;j++){
cout<<c[i][j]<<" ";
}
cout<<endl;
}
}
int main(){
int t;
t=1;
while(t--){
solve();
}
return 0;
}
2.斐波那契
//矩阵乘法加速递推 斐波那契数列
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 10000;
int n;
void mul(int f[2],int a[2][2]){
//对f操作
int c[2];
memset(c,0,sizeof(c));
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
c[j]=(c[j]+(ll)f[k]*a[k][j]) % mod;
}
}
memcpy(f,c,sizeof(c));//复制
}
void mulself(int a[2][2]){
//矩阵乘法
int c[2][2];
memset(c,0,sizeof(c));
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
c[i][j]=(c[i][j]+(ll)a[i][k]*a[k][j])%mod;
}
}
}
memcpy(a,c,sizeof(c));//复制
}
int main(){
while(cin>>n&&n!=-1){
int f[2]={
0,1};//每次只需要保留2个数据
int a[2][2]={
{
0,1},{
1,1}};//A矩阵
for(;n;n>>=1){
//快速幂
if(n&1) mul(f,a);
mulself(a);
}
cout<<f[0]<<endl;
}
}
3.矩阵快速幂模板
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 105;
const int mod = 1e9+7;
struct matrix{
ll m[N][N];
};
ll n,k;
matrix mul(matrix a,matrix b){
//矩阵乘法
matrix ans;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j]%mod)%mod;
}
}
}
return ans;
}
matrix qk(matrix a,ll b){
//矩阵快速幂
matrix ans;//答案矩阵
//先初始化
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) ans.m[i][j]=1;
else ans.m[i][j]=0;
}
}
//快速幂的矩阵写法
while(b){
if(b&1) ans = mul(a,ans);
a=mul(a,a);
b>>=1;
}
return ans;
}
int main(){
cin>>n>>k;
matrix a;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a.m[i][j];
}
}
matrix ans = qk(a,k);//矩阵快速幂
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<ans.m[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
边栏推荐
猜你喜欢
随机推荐
穿越派·派盘(WebDAV)解决OmniFocus同步问题
关于字符串根据字典序排序的方法
Canvas绘图基础知识
将板子芯片从ST32F101改为STM32F103要改的地方
遇到一个STM32中断的坑,记录一下(和NVIC的抢占位设置有关)
一种新的测转速的方法
如何升级穿越派V3.14版本?
了解CI/CD流水线
C# 如何关联键盘按钮 (KeyChar/KeyCode值 KeyPress/KeyDown事件 区别)
面试题--数据库事务四大特性及事务的隔离级别
第五章 数据链路层与局域网
pc端电脑屏幕常见尺寸
对js基础知识的一些理解
ADXL345调试心得
小程序textarea完美填坑
OSPF实验
C#在控制台应用程序中显示输出字节型数据
2017年10月历史文章汇总
Dart高级(一)——泛型与Json To Bean
C-关键字之volatile