题目如图
(这里都默认能够进行矩阵乘法运算)这两个题目都主要考察矩阵乘法的运算方式,较为简单。两个矩阵能够相乘的条件是第一个矩阵的列数和第二个矩阵的行数相同,例如A矩阵为3行2列,B矩阵为2行3列,则AB两个矩阵可以相乘,并且得到的矩阵为3行3列,同理若A为3行3列,B为3行2列,则得到的矩阵为3行2列
如果A矩阵为2行3列,B矩阵为2行2列,则AB两矩阵无法相乘。
在确定最终矩阵的行列数后,其第n行第m列的数就为A矩阵第n行与B矩阵第m列的数一一对应相乘后再相加的和。
这步操作可以用如下代码表示
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
for(int k=0;k<p;k++){
ans[i][j] += R1[i][k]*R2[k][j];
}
}
}
第一题的代码如下
#include<iostream>
using namespace std;
const int N=105;
int R1[N][N],R2[N][N],ans[N][N];
int main(){
int m,p,n;
cin>>m>>p>>n;
for(int i=0;i<m;i++){//录入第一个矩阵
for(int j=0;j<p;j++){
cin>>R1[i][j];
}
}
for(int i=0;i<p;i++){//录入第二个矩阵
for(int j=0;j<n;j++){
cin>>R2[i][j];
}
}
for(int i=0;i<m;i++){//两个矩阵相乘
for(int j=0;j<n;j++){
for(int k=0;k<p;k++){
ans[i][j] += R1[i][k]*R2[k][j];
}
}
}
for(int i=0;i<m;i++){//输出最终矩阵
for(int j=0;j<n;j++){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
第二个问题是离散数学中的关系矩阵问题,设关系矩阵为R1: 1 0 1 R2: 1 0 1
1 0 1 0 1 1
0 1 0 1 0 0
则根据公式运算方法为
1∧1 ∨ 0∧0 ∨ 1∧1 1∧0 ∨ 0∧1 ∨ 1∧0 1∧1 ∨ 0∧1 ∨ 1∧0
1∧1 ∨ 0∧0 ∨ 1∧1 1∧0 ∨ 0∧1 ∨ 1∧0 1∧1 ∨ 0∧1 ∨ 1∧0
0∧1 ∨ 1∧0 ∨ 0∧1 0∧0 ∨ 1∧ 1 ∨ 0∧0 0∧1∨ 1∧1 ∨ 0∧0
因为数据量较小,我们还可以采用如下方法;观察到两数合取时只有都为1时,结果为1,其余为0,与矩阵乘法类似;而每项数据之间又是合取,所以只要
经过矩阵乘法后得到结果大于等于1,说明该项为1,否则为0,按此思路,只需在第一题的基础上加上判断即可,如下
if(ans[i][j]==0) ans[i][j]=0;
else ans[i][j]=1;
完整代码如下:
#include<iostream>
using namespace std;
const int N=105;
int R1[N][N],R2[N][N];
int ans[N][N];
int main(){
int a,b,c;
cin>>a>>b>>c;
for(int i=0;i<a;i++){
for(int j=0;j<b;j++){
cin>>R1[i][j];
}
}
for(int i=0;i<b;i++){
for(int j=0;j<c;j++){
cin>>R2[i][j];
}
}
for(int i=0;i<a;i++){
for(int j=0;j<c;j++){
for(int k=0;k<b;k++){
ans[i][j]+=R1[i][k]*R2[k][j];
}
if(ans[i][j]==0) ans[i][j]=0;
else ans[i][j]=1;
}
}
for(int i=0;i<a;i++){
for(int j=0;j<c;j++){
cout<<ans[i][j]<<' ';
}
cout<<endl;
}
return 0;
}