7-2 矩阵的乘法运算线性代数中的矩阵可以表示为一个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
#include<iostream>
#include<iomanip>
class matrix
{
private:
int row;
int column;
int** mat;
int shulie; //判断是数列还是数(当row==1&&column==1不用对称也可以相乘)
public:
matrix(int r=0,int c=0):row(r),column(c) //重点:构造函数 二维数组指针的初始化
{
int i, j;
mat = new int* [row];
for (i = 0; i < row; i++)
mat[i] = new int[column];
for (i = 0; i < row; i++)
for (j = 0; j < column; j++)
mat[i][j] = 0;
}
void m_cin(); //用来输入数列
matrix operator* (matrix); //数列相乘乘号重载
void display(); //输出
bool panduan(); //判断是数列还是数
};
bool matrix::panduan() //判断是数列还是数
{
if (row == 1 && column == 1)
{
shulie = 0;
return 0;
}
else
{
shulie = 1;
return 1;
}
}
void matrix::m_cin() //用来输入数列
{
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < column;j++)
std::cin >>mat[i][j];
}
matrix matrix::operator* (matrix m) //数列相乘乘号重载
{
int i, j;
int k = 0; //注意分类讨论
if (shulie==0)
{
matrix m3(m.row, m.column); //初始化的不同
for (i = 0; i < m.row; i++)
for (j = 0; j < m.column; j++)
m.mat[i][j] = mat[0][0] * m.mat[i][j];
return m;
}
else if(m.shulie==0)
{
matrix m3(row, column); //初始化的不同
for (i = 0; i < row; i++)
for (j = 0; j < column; j++)
m.mat[i][j] =m. mat[0][0] * mat[i][j];
return m;
}
else
{
matrix m3(row, m.column); //初始化的不同
for (i = 0; i < row; i++)
for (j = 0; j < m.column; j++)
for (k = 0; k < m.row; k++)
m3.mat[i][j] += mat[i][k] * m.mat[k][j];
return m3;
}
}
void matrix:: display() //输出
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < column; j++)
{
std::cout << std::setw(10) << mat[i][j];
}
std::cout << std::endl;
}
}
int main()
{
int m1_r, m2_r, m1_c, m2_c;
std::cin >> m1_r >> m1_c;
matrix m1(m1_r, m1_c);
m1.m_cin();
std::cin >> m2_r >> m2_c;
matrix m2(m2_r, m2_c);
m2.m_cin();
int m1_shulie=m1.panduan();
int m2_shulie = m2.panduan();
if (m1_c != m2_r&&m1_shulie*m2_shulie!=0) //注意要排除是数的情况
std::cout << "Invalid Matrix multiplication!" << std::endl;
else
{
m1 = m1 * m2;
m1.display();
}
}