7-1 矩阵的乘法运算 (20 分)
线性代数中的矩阵可以表示为一个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
作者
he
单位
福州大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<iostream> #include <iomanip> using namespace std; class Matrix { public: Matrix(int, int); ~Matrix(); friend istream& operator>>(istream&is, Matrix&a); int getRow(){return row;} int getColum(){return column;} friend Matrix operator*(Matrix&, Matrix&); Matrix(const Matrix&); void display(); private: int row; int column; int** mat; }; Matrix::Matrix(int r, int c) { row = r; column = c; mat = new int*[r+2]; for(int i = 0; i < row+2; i++) { mat[i] = new int[c+2]; } } Matrix::~Matrix() { for(int i = 0; i <row+2; i++) delete []mat[i]; delete []mat; } istream& operator>>(istream & is, Matrix & a){ for(int i=0; i<a.row; i++) { for(int j=0; j<a.column; j++) { is>>a.mat[i][j]; } } } Matrix operator*(Matrix&a, Matrix&b){ int i,j,k,x; if(a.row==1&&a.column==1) { Matrix p (b.row,b.column); for(i=0;i<b.row;i++){ for(j=0;j<b.column;j++){ p.mat[i][j]=a.mat[0][0]*b.mat[i][j]; } } return p; } else { Matrix p (a.row,b.column); for(i=0; i<a.row; i++) { for(j=0; j<b.column; j++) { x=0; for(k=0; k<a.column; k++) { x+=a.mat[i][k]*b.mat[k][j]; } p.mat[i][j]=x; } } return p; } } Matrix::Matrix(const Matrix&p){ this->row=p.row; this->column=p.column; this->mat=new int* [p.row+2]; int i,j; for(i=0; i<p.row+2; i++) { this->mat[i]=new int [p.column+2]; for(j=0; j<p.column; j++) { this->mat[i][j]=p.mat[i][j]; } } } void Matrix::display(){ for(int i=0; i<row; i++) { for(int j=0; j<column; j++) { cout<<setw(10)<<mat[i][j]; } cout<<endl; } } int main() { int a,b,i,j; cin>>a>>b; Matrix x(a,b); cin>>x; cin>>a>>b; Matrix y(a,b); cin>>y; if(x.getColum()==y.getRow()||x.getColum()==1&&x.getRow()==1||y.getRow()==1&&y.getRow()==1) { Matrix z=x*y; z.display(); } else{ cout<<"Invalid Matrix multiplication!"; } return 0; }