题目要求
线性代数中的矩阵可以表示为一个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
解题思路
首先创建一个矩阵类 matrix
,然后定义矩阵的行数 row
、列数 column
和矩阵元素 mat
,并在类中定义矩阵的构造函数、输入函数 get()、输出函数 display()、判断两个矩阵能否相乘的友元函数 judge() 和矩阵乘法运算符operator*()
-
定义矩阵类 matrix,其中包含矩阵的行数 row、列数 column 和元素 mat。矩阵的构造函数可以不用定义什么操作,因为默认初始化时行列数都为0,指向元素的指针也为空,不会影响后续使用。
-
在类中定义输入函数 get(),用于输入矩阵的行数、列数和元素,并将其存储到类的私有成员变量中。在函数内部可以使用二维数组动态分配内存,确保输入的数据能够正确存储。
-
在类中定义输出函数 display(),用于输出矩阵的元素。在输出时可以使用 setw() 控制输出宽度,使矩阵能够更加美观地显示出来。
-
在类外定义判断两个矩阵能否相乘的友元函数 judge(),用于判断两个矩阵是否符合矩阵乘法的条件。即第一个矩阵的列数必须等于第二个矩阵的行数才能相乘,否则无法进行矩阵乘法。
注意,如果其中一个矩阵是 1×11×1 矩阵,那么它也可以和任何一个矩阵相乘。 -
在类外定义矩阵乘法运算符 operator*(),使用友元函数的形式重载运算符。在运算符内部,首先判断第一个矩阵是否是 1×11×1 矩阵,如果是,则直接针对第二个矩阵进行乘法操作;否则,根据矩阵乘法的定义循环遍历计算每个元素的值,并存储到一个新的矩阵中。
-
在主函数 main() 中,首先通过输入参数创建两个矩阵对象 m1 和 m2,然后调用 judge() 函数判断它们是否能够相乘。如果可以,则调用矩阵乘法运算符 operator*() 计算它们的乘积,并将结果保存到另一个矩阵对象 m3 中,最后使用 display() 函数输出 m3 的元素。文章来源:https://www.toymoban.com/news/detail-764174.html
代码
#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;
}
总结
该题考察矩阵乘法的基本概念,例如如何判断两个矩阵是否能够相乘
,如何实现矩阵乘法的核心计算操
作等,读者可躬身实践。
我是秋说,我们下次见。文章来源地址https://www.toymoban.com/news/detail-764174.html
到了这里,关于[C++/PTA] 矩阵的乘法运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!