例題:
輸入矩陣的行列,分別輸入兩個矩陣,輸出矩陣相乘的結果
#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=0i<ai++){ //矩陣的行
for(int j=0j<bj++){ //矩陣的列
cin>>X[i][j]
}
}
cout<<"請輸入第二個矩陣:"<<endl
for(int i=0i<bi++){ //矩陣的行
for(int j=0j<cj++){ //矩陣的列
cin>>Y[i][j]
}
}
memset(Z,0,sizeof(Z)) //將二維數組Z初始化爲0
//int temp=0
cout<<"矩陣相乘的結果爲:"<<endl
for(int i=0i<ai++){
for(int j=0j<cj++){
for(int k=0k<bk++){
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
ze(a)
for(int i=0i&()i++){
X[i]ze(b)
}
ze(b)
for(int i=0i&()i++){
Y[i]ze(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
}
給定三階方陣A:A={{a,b,c},{d,e,f},{p,q,r}},把第一行的第一個數字變成1,也就是用初等矩陣u來左乘A:u = {{1/a, 0, 0}, {0, 1, 0}, {0, 0, 1}}。
讓第二行第一個數字變成0:把第三行乘以-d/p,加到第二行上,這個過程對應的初等矩陣是:v=I+(-d/p)*e_(2,3)= {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}} + {{0, 0, 0}, {0, 0, -d/p}, {0, 0, 0}}。
再把第一行乘以-p,加到第三行上對應的初等矩陣是:w=I+(-p)*e_(3,1)= {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}} + {{0, 0, 0}, {0, 0, 0}, {-p, 0, 0}}。
再把第三行第二個元素變成0:第二行乘以-(p (-b p + a q))/(a (e p - d q)),加到第三行上,對應的初等矩陣是——x=I+(-(p (-b p + a q))/(a (e p - d q)))*e_(3,2)
={{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}+ {{0, 0, 0}, {0, 0, 0}, {0, -(p (-b p + a q))/(a (e p - d q)), 0}},注意此時的x.(w.(v.(u.A)))是上三角矩陣。
三個矩陣相乘時,按照順序相乘即可,比如ABC,先乘AB,再算ABC,這樣是對的也可以先算BC,再算ABC,因爲矩陣乘法滿足結合律。矩陣乘法的性質:
1、滿足乘法結合律: (AB)C=A(BC)2、滿足乘法左分配律:(A+B)C=AC+BC 3、滿足乘法右分配律:C(A+B)=CA+CB4、滿足對數乘的結合性k(AB)=(kA)B=A(kB)
5、轉置 (AB)T=BTAT6、矩陣乘法一般不滿足交換律乘法結合律:三個數相乘,先把前面兩個數相乘,先乘第三個數,或者先把後面兩個數相乘,再和第一個數相乘,它們的積不變。字母表示:(a×b)×c=a×(b×c)集合交併集合的交,並運算都滿足結合律:交:(A∩B)∩C=A∩(B∩C)並:(A∪B)∪C=A∪(B∪C)矩陣乘法矩陣乘法滿足結合律。一個A x B的矩陣乘以一個B x C的矩陣將得到一個A x C的矩陣,時間複雜度爲A x B x C。