題目要求
線性代數(shù)中的矩陣可以表示為一個(gè)row*column的二維數(shù)組,當(dāng)row和column均為1時(shí),退化為一個(gè)數(shù),當(dāng)row為1時(shí),為一個(gè)行向量,當(dāng)column為1時(shí),為一個(gè)列向量。
建立一個(gè)整數(shù)矩陣類matrix,其私有數(shù)據(jù)成員如下:
int row;
int column;
int **mat;
建立該整數(shù)矩陣類matrix構(gòu)造函數(shù);
建立一個(gè) *(乘號)的運(yùn)算符重載,以便于對兩個(gè)輸入矩陣進(jìn)行乘法運(yùn)算;
建立輸出函數(shù)void display(),對整數(shù)矩陣按行進(jìn)行列對齊輸出,格式化輸出語句如下:
cout<<setw(10)<<mat[i][j];
//需要#include <iomanip>
主函數(shù)里定義三個(gè)整數(shù)矩陣類對象m1、m2、m3.
###輸入格式:
分別輸入兩個(gè)矩陣,分別為整數(shù)矩陣類對象m1和m2。
每個(gè)矩陣輸入如下:
第一行兩個(gè)整數(shù) r c,分別給出矩陣的行數(shù)和列數(shù)
接下來輸入r行,對應(yīng)整數(shù)矩陣的每一行
每行輸入c個(gè)整數(shù),對應(yīng)當(dāng)前行的c個(gè)列元素
###輸出格式:
整數(shù)矩陣按行進(jìn)行列對齊(寬度為10)后輸出
判斷m1和m2是否可以執(zhí)行矩陣相乘運(yùn)算。
若可以,執(zhí)行m3=m1*m2運(yùn)算之后,調(diào)用display函數(shù),對m3進(jìn)行輸出。
若不可以,輸出"Invalid Matrix multiplication!"
提示:輸入或輸出的整數(shù)矩陣,保證滿足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
解題思路
首先創(chuàng)建一個(gè)矩陣類 matrix
,然后定義矩陣的行數(shù) row
、列數(shù) column
和矩陣元素 mat
,并在類中定義矩陣的構(gòu)造函數(shù)、輸入函數(shù) get()、輸出函數(shù) display()、判斷兩個(gè)矩陣能否相乘的友元函數(shù) judge() 和矩陣乘法運(yùn)算符operator*()
-
定義矩陣類 matrix,其中包含矩陣的行數(shù) row、列數(shù) column 和元素 mat。矩陣的構(gòu)造函數(shù)可以不用定義什么操作,因?yàn)槟J(rèn)初始化時(shí)行列數(shù)都為0,指向元素的指針也為空,不會影響后續(xù)使用。
-
在類中定義輸入函數(shù) get(),用于輸入矩陣的行數(shù)、列數(shù)和元素,并將其存儲到類的私有成員變量中。在函數(shù)內(nèi)部可以使用二維數(shù)組動態(tài)分配內(nèi)存,確保輸入的數(shù)據(jù)能夠正確存儲。
-
在類中定義輸出函數(shù) display(),用于輸出矩陣的元素。在輸出時(shí)可以使用 setw() 控制輸出寬度,使矩陣能夠更加美觀地顯示出來。
-
在類外定義判斷兩個(gè)矩陣能否相乘的友元函數(shù) judge(),用于判斷兩個(gè)矩陣是否符合矩陣乘法的條件。即第一個(gè)矩陣的列數(shù)必須等于第二個(gè)矩陣的行數(shù)才能相乘,否則無法進(jìn)行矩陣乘法。
注意,如果其中一個(gè)矩陣是 1×11×1 矩陣,那么它也可以和任何一個(gè)矩陣相乘。 -
在類外定義矩陣乘法運(yùn)算符 operator*(),使用友元函數(shù)的形式重載運(yùn)算符。在運(yùn)算符內(nèi)部,首先判斷第一個(gè)矩陣是否是 1×11×1 矩陣,如果是,則直接針對第二個(gè)矩陣進(jìn)行乘法操作;否則,根據(jù)矩陣乘法的定義循環(huán)遍歷計(jì)算每個(gè)元素的值,并存儲到一個(gè)新的矩陣中。
-
在主函數(shù) main() 中,首先通過輸入?yún)?shù)創(chuàng)建兩個(gè)矩陣對象 m1 和 m2,然后調(diào)用 judge() 函數(shù)判斷它們是否能夠相乘。如果可以,則調(diào)用矩陣乘法運(yùn)算符 operator*() 計(jì)算它們的乘積,并將結(jié)果保存到另一個(gè)矩陣對象 m3 中,最后使用 display() 函數(shù)輸出 m3 的元素。文章來源:http://www.zghlxwxcb.cn/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;
}
總結(jié)
該題考察矩陣乘法的基本概念,例如如何判斷兩個(gè)矩陣是否能夠相乘
,如何實(shí)現(xiàn)矩陣乘法的核心計(jì)算操
作等,讀者可躬身實(shí)踐。
我是秋說,我們下次見。文章來源地址http://www.zghlxwxcb.cn/news/detail-764174.html
到了這里,關(guān)于[C++/PTA] 矩陣的乘法運(yùn)算的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!