ccf202305-2矩阵相乘

原题链接:矩阵相乘

首先我们要知道矩阵什么时候才能进行相乘:首先,两个矩阵要是想相乘需要满足,第一个矩阵的列数等于第二个矩阵的行数。

具体的做法是:

最终得到的矩阵的结果是:新矩阵的行数等于左边矩阵的行数,新矩阵的列数等于右边矩阵的列数,即左行右列。一个m*n的矩阵和一个n*p的矩阵相乘,将会得到一个m*p的矩阵。

接下来是两个矩阵相乘的代码实现,需要用到三个循环

 cin>>n>>m;//矩阵a为n*m(n行m列) 
	for(int i=0;i<n;i++)
	  for(int j=0;j<m;j++)
	    scanf("%d",&a[i][j]);
		
    cin>>p;  //矩阵b为m*p(m行p列)
    for(int i=0;i<m;i++)
	  for(int j=0;j<p;j++)
	    scanf("%d",&b[i][j]);	
		
    for(int i=0;i<n;i++)   //矩阵c是a与b相乘得到的 
	  for(int j=0;j<p;j++) //n*p(n行p列) 
	    for(int k=0;k<m;k++)
		  c[i][j]+=a[i][k]*b[k][j];

这个循环的边界其实也很好记忆,因为左行右列,所以c矩阵是一个n*p的矩阵,所以外层的两层循环分别是n和p,最内层是m(左列==右行==m);

当然在这个题目中,我们要知道这道题的重点在于时间复杂度,如果先算QK矩阵相乘,会得到n * n的矩阵,会显示超时,所以要先算后面两个矩阵,时间复杂度是可以过的。因为先计算后面两个矩阵得到的是一个k*k的矩阵k<20;同时还要注意的一点是这个题目中中间过程存储数据的数组要用long long类型

下面是代码实现

#include<iostream>
using namespace std;
long long temp[20][20],temp2[10000][20];
int Q[10000][20],K[20][10000],V[10000][20];
int main(){
	int n,d;
	cin>>n>>d;
	for(int i=0;i<n;i++){
		for(int k=0;k<d;k++){
			scanf("%d", &Q[i][k]);
		}
	}
		for(int i=0;i<n;i++){
		for(int k=0;k<d;k++){
			scanf("%d", &K[k][i]);
		}
	}
	for(int i=0;i<n;i++){
		for(int k=0;k<d;k++){
			scanf("%d", &V[i][k]);
		}
	}
	int W[n];
	for(int i=0;i<n;i++){
		scanf("%d", &W[i]);
	}
	
	//前面代码没问题 
	for(int i=0;i<d;i++){
		for(int k=0;k<d;k++){
			for(int j=0;j<n;j++){
				temp[i][k]+=K[i][j]*V[j][k];
			}
		}
	}
	for(int i=0;i<n;i++){
		for(int k=0;k<d;k++){
			for(int j=0;j<d;j++){
				temp2[i][k]+=Q[i][j]*temp[j][k];
			}
		}
	}
	for(int i=0;i<n;i++){
		for(int k=0;k<d;k++){
			temp2[i][k]*=W[i];
		}
	}
	for(int i=0;i<n;i++){
		for(int k=0;k<d;k++){
			cout<<temp2[i][k]<<' ';
		}
		cout<<endl;
	}
	return 0; 
} 

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值