【C++ | PTA】矩阵的乘法运算

题目要求

线性代数中的矩阵可以表示为一个row*column的二维数组,当row和column均为1时,退化为一个数,当row为1时,为一个行向量,当column为1时,为一个列向量。

建立一个整数矩阵类matrix,其私有数据成员如下:

int row;
int column;
int **mat;

建立该整数矩阵类matrix构造函数;

建立一个 *(乘号)的运算符重载,以便于对两个输入矩阵进行乘法运算;
建立输出函数void display(),对整数矩阵按行进行列对齐输出,格式化输出语句如下:

cout<<setw(10)<<mat[i][j];
//需要#include <iomanip>

主函数里定义三个整数矩阵类对象m1、m2、m3.

输入格式:
分别输入两个矩阵,分别为整数矩阵类对象m1和m2。
每个矩阵输入如下:
第一行两个整数 r c,分别给出矩阵的行数和列数
接下来输入r行,对应整数矩阵的每一行
每行输入c个整数,对应当前行的c个列元素

输出格式:
整数矩阵按行进行列对齐(宽度为10)后输出
判断m1和m2是否可以执行矩阵相乘运算。
若可以,执行m3=m1*m2运算之后,调用display函数,对m3进行输出。
若不可以,输出"Invalid Matrix multiplication!"
提示:输入或输出的整数矩阵,保证满足row>=1和column>=1。

输入样例:

4  5
1 0 0 0 5
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
5  5
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 8 9
5 6 7 8 9

输出样例:

    26        32        38        44        50
     4         6         8        10        12
     9        12        15        18        21
    16        20        24        32        36

解题思路

在类外定义判断两个矩阵能否相乘的友元函数 judge(),即第一个矩阵的列数必须等于第二个矩阵的行数才能相乘,否则无法进行矩阵乘法。

注意,如果其中一个矩阵是 1×11×1 矩阵,那么它也可以和任何一个矩阵相乘。

在类外定义矩阵乘法运算符 operator*(),使用友元函数的形式重载运算符。在运算符内部,首先判断第一个矩阵是否是 1×11×1 矩阵,如果是,则直接针对第二个矩阵进行乘法操作;否则,根据矩阵乘法的定义循环遍历计算每个元素的值,并存储到一个新的矩阵中。

代码

#include<iostream>
#include<iomanip>
using namespace std;
class matrix{
 private:
  int row;     
  int column;
  int **mat;       
 public:
  matrix(int a=0,int b=0):row(a),column(b){};   
  void get(int ,int);     
  void display();        
  friend bool judge(const matrix &a,const matrix &b);   
    friend matrix operator*(const matrix &a,const matrix &b);  
};
void matrix::get(int a,int b){  
 int v,q;
 row=a;                
 column=b;
 mat=new int*[a];
 for(v=0;v<a;v++){       
  mat[v]=new int[b];
 }
 for(v=0;v<row;v++){
  for(q=0;q<column;q++){
   cin>>mat[v][q];
  }
 }
}
bool judge(const matrix &a,const matrix &b){
 if(a.column==b.row||a.column==1&&a.row==1){   
  return true;                              
 }else{                                     
     return false;
 }
}
void matrix::display(){
    int v,q;
    for(v=0;v<row;v++){
     for(q=0;q<column;q++){
      cout<<setw(10)<<mat[v][q];
  }
  cout<<endl;         
 }
}
matrix operator*(const matrix &a,const matrix &b){
 matrix c;
 int v=0,q=0,k=0,l=0,sum=0;
 if(a.column==1&&a.row==1){     
  c.row=b.row;
  c.column=b.column;
  c.mat=new int*[b.row];
 for(v=0;v<b.row;v++){
  c.mat[v]=new int[b.column];
 }
 for(v=0;v<b.row;v++){
  for(q=0;q<b.column;q++){    
   c.mat[v][q]=a.mat[0][0]*b.mat[v][q];
  }
 }
 }else{
 c.row=a.row;       
 c.column=b.column;
 c.mat=new int*[a.row];
 for(v=0;v<a.row;v++){
  c.mat[v]=new int[b.column];
 }
 for(v=0;v<a.row;v++){
  for(q=0;q<b.column;q++){   
   for(k=0;k<a.column;k++){
   sum+=a.mat[v][k]*b.mat[k][q]; 
   }
   c.mat[v][q]=sum;
   sum=0;
  }
 }
 }
 return c;
}
int main(){         
 matrix m1,m2,m3;
 int a,b;
 cin>>a>>b;
 m1.get(a,b);
 cin>>a>>b;
 m2.get(a,b);
 if(judge(m1,m2)){
  m3=m1*m2;
  m3.display();
 }else{
  cout<<"Invalid Matrix multiplication!"<<endl;
 }
 return 0;
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏,祝你平安喜乐。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值