三階矩陣乘三階矩陣的例題?
例題:輸入矩陣的行列,分別輸入兩個矩陣,輸出矩陣相乘的結果
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c;
cout<<"請輸入兩矩陣的行列:"<<endl;
cin>>a>>b>>c; //分別錄入第一個矩陣的行,兩矩陣共同行列,第二個矩陣的列
int X[a][b],Y[b][c],Z[a][c]; //開辟三個二維數組存儲矩陣,注意相乘結果的行列值
cout<<"請輸入第一個矩陣:"<<endl;
for(int i=0;i<a;i++){ //矩陣的行
for(int j=0;j<b;j++){ //矩陣的列
cin>>X[i][j];
}
}
cout<<"請輸入第二個矩陣:"<<endl;
for(int i=0;i<b;i++){ //矩陣的行
for(int j=0;j<c;j++){ //矩陣的列
cin>>Y[i][j];
}
}
memset(Z,0,sizeof(Z)); //將二維數組Z初始化為0
//int temp=0;
cout<<"矩陣相乘的結果為:"<<endl;
for(int i=0;i<a;i++){
for(int j=0;j<c;j++){
for(int k=0;k<b;k++){
Z[i][j]=Z[i][j]+X[i][k]*Y[k][j]; //行與列的乘積和為相應結果值
//temp=temp+X[i][k]*Y[k][j];
}
cout<<Z[i][j]<<" "; //計算完一個后輸出
//cout<<temp<<" ";
//temp=0;
}
cout<<endl; //計算完一列后輸出換行
}
return 0;
}
//本程序也可以不開辟存放結果的二維數組矩陣,直接將結果累加到temp中進行輸出,
//當輸出后重新將temp中的值置0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
注意memset函數:
memset函數實現對指定內存空間初始化的作用。
memset(Z,0,sizeof(Z)); //將二維數組Z初始化為0
int float long string sizeof函數返回數組元素空間的4倍數(一元素占4字節)
char sizeof函數返回數組元素空間大小(一元素占1字節)
double sizeof函數返回數組元素空間8倍數(一元素占8字節)
將矩陣相乘的方法體拿出來
#include<bits/stdc++.h>
using namespace std;
int jzcheng(int *q, int *w, int h, int l, int k) //定義兩個指針,指向二維數組變為一維數組后的首地址
{
int Z[h][k]; //h*k
// memset(Z, 0, sizeof(Z)); //將二維數組Z初始化為0
//int temp=0;
//cout<<"矩陣相乘的結果為:"<<endl;
//cout<<'\n';
for(int i = 0; i < h; i++)
{
for(int j = 0; j < k; j++)
{
Z[i][j]=0;
for(int n = 0; n < l; n++)
{
Z[i][j] = Z[i][j] + q[i * l + n] * w[n * k + j]; //行與列的乘積和為相應結果值,認真思考為什么是這樣,看作一維數組
//temp=temp+X[i][k]*Y[k][j];
}
cout << Z[i][j] << " "; //計算完一個后輸出
//cout<<temp<<" ";
//temp=0;
}
cout<<'\n';
}
}
int main()
{
int a, b, c;
cout << "請輸入兩矩陣的行列:" << endl;
cin >> a >> b >> c; //分別錄入第一個矩陣的行,兩矩陣共同行列,第二個矩陣的列
int X[a][b], Y[b][c]; //開辟三個二維數組存儲矩陣,注意相乘結果的行列值
cout << "請輸入第一個矩陣:" << endl;
for(int i = 0; i < a; i++) //矩陣的行
{
for(int j = 0; j < b; j++) //矩陣的列
{
cin >> X[i][j];
}
}
cout << "請輸入第二個矩陣:" << endl;
for(int i = 0; i < b; i++) //矩陣的行
{
for(int j = 0; j < c; j++) //矩陣的列
{
cin >> Y[i][j];
}
}
jzcheng(*X, *Y, a, b, c);
//也可寫作jzcheng(X[0], Y[0], a, b, c);均代表以a[0][0]為首元素的一維數組;可用作指針
return 0;
}
//本程序也可以不開辟存放結果的二維數組矩陣,直接將結果累加到temp中進行輸出,
//當輸出后重新將temp中的值置0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
用vector定義二維數組,避免指針情況
#include<bits/stdc++.h>
using namespace std;
int jzcheng(vector<vector<int> >X, vector<vector<int> >Y, int h, int l, int k)
{
int Z[h][k];//h*k
memset(Z, 0, sizeof(Z)); //將二維數組Z初始化為0
//int temp=0;
cout<<"矩陣相乘的結果為:"<<endl;
//cout<<'\n';
for(int i = 0; i < h; i++)
{
for(int j = 0; j < k; j++)
{
//Z[i][j]=0;
for(int n = 0; n < l; n++)
{
Z[i][j] = Z[i][j] + X[i][n] * Y[n][j]; //行與列的乘積和為相應結果值
//temp=temp+X[i][k]*Y[k][j];
}
cout << Z[i][j] << " "; //計算完一個后輸出
//cout<<temp<<" ";
//temp=0;
}
cout<<'\n';
}
}
int main()
{
int a, b, c;
cout << "請輸入兩矩陣的行列:" << endl;
cin >> a >> b >> c; //分別錄入第一個矩陣的行,兩矩陣共同行列,第二個矩陣的列
vector<vector<int> >X;
vector<vector<int> >Y;
X.resize(a);
for(int i=0;i<X.size();i++){
X[i].resize(b);
}
Y.resize(b);
for(int i=0;i<Y.size();i++){
Y[i].resize(c);
} //開辟三個二維數組存儲矩陣,注意相乘結果的行列值
cout << "請輸入第一個矩陣:" << endl;
for(int i = 0; i < a; i++) //矩陣的行
{
for(int j = 0; j < b; j++) //矩陣的列
{
cin >> X[i][j];
}
}
cout << "請輸入第二個矩陣:" << endl;
for(int i = 0; i < b; i++) //矩陣的行
{
for(int j = 0; j < c; j++) //矩陣的列
{
cin >> Y[i][j];
}
}
jzcheng(X, Y, a, b, c);
return 0;
}