利用C++實現矩陣的構造,通過運算符的重載實現矩陣的乘法、加法等。并且實現矩陣形狀的打印,矩陣的打印。
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
#include<iostream> #include<memory> #include<assert.h> #include<stdlib.h> using namespace std; class Matrix{ public : Matrix( int row, int col); //構造函數 Matrix( int row, int col, int num); //構造函數重載 ~Matrix(); //析構函數 Matrix( const Matrix & other); //賦值函數 Matrix operator*( const Matrix& other); //矩陣相乘 Matrix operator+( const Matrix& other); //矩陣相加 Matrix operator-( const Matrix& other); //矩陣相減 int **a = nullptr; //初始化一共空指針 int row, col; void shape(); //打印矩陣形狀 void Ma_pri(); //打印矩陣 }; int main(){ Matrix a(2,1); //構造一個(2,1)矩陣 Matrix b(1,2); //構造一個(1,2)矩陣 a.a[0][0] = 4; //初始化矩陣 a.a[1][0] = 2; b.a[0][0] = 3; b.a[0][1] = 5; a.shape(); //矩陣形狀打印 b.shape(); Matrix c = a*b; //矩陣相乘 c.shape(); c.Ma_pri(); //矩陣打印 Matrix d(3,3,1); d.Ma_pri(); system ( "pause" ); return 0; } Matrix::Matrix( int row, int col){ this ->row = row; this ->col = col; this ->a = new int *[row]; for ( int i=0;i< this ->row;i++){ a[i] = new int [ this ->col]; } } Matrix::Matrix( int row, int col, int num){ this ->row = row; this ->col = col; this ->a = new int *[row]; for ( int i=0;i< this ->row;i++){ a[i] = new int [ this ->col]; } for ( int i = 0; i < this ->row; i++){ for ( int j =0; j < this ->row; j++){ this ->a[i][j] = num; } } } Matrix::~Matrix(){ for ( int i=0;i< this ->row;i++){ if (a[i] != nullptr){ delete [] a[i]; a[i] = nullptr; } } if (a != nullptr){ delete [] a; a = nullptr; } } Matrix::Matrix( const Matrix& other){ row = other.row; col = other.col; a = new int *[row]; for ( int i=0;i<row;i++){ a[i] = new int [col]; memcpy (a[i], other.a[i], sizeof ( int )*col); } } Matrix Matrix::operator*( const Matrix& other){ if ( this ->col != other.row){ cout<< "shape error" <<endl; exit (0); } Matrix m( this ->row,other.col); for ( int i=0; i< this ->row; i++){ for ( int j=0;j<other.col;j++){ int sum = 0; for ( int k=0;k< this ->col;k++){ sum += this ->a[i][k] * other.a[k][j]; } m.a[i][j] = sum; } } return m; } Matrix Matrix::operator+( const Matrix& other){ if ( this ->col != other.col or this ->row != other.row){ cout<< "shape error" <<endl; exit (0); } Matrix m( this ->row, this ->col); for ( int i = 0;i < this ->row; i++){ for ( int j = 0; j < this -> col; j++){ m.a[i][j] = this ->a[i][j] + other.a[i][j]; } } return m; } Matrix Matrix::operator-( const Matrix& other){ if ( this ->col != other.col or this ->row != other.row){ cout<< "shape error" <<endl; exit (0); } Matrix m( this ->row, this ->col); for ( int i = 0;i < this ->row; i++){ for ( int j = 0; j < this -> col; j++){ m.a[i][j] = this ->a[i][j] - other.a[i][j]; } } return m; } void Matrix::shape(){ cout<< "(" << this ->row<< "," << this ->col<< ")" <<endl; } void Matrix::Ma_pri(){ for ( int i = 0; i < this ->row; i++){ for ( int j =0; j < this ->row; j++){ cout<< this ->a[i][j]<< " " ; } cout<<endl; } } |
矩陣求逆算法及程序實現
在做課題時,遇到了求多項式問題,利用了求逆方法。矩陣求逆一般使用簡單的算法,還有快速算法 如全選主元高斯-約旦消元法,但本文程序主要寫了簡單的矩陣求逆算法定義法之伴隨矩陣求逆公式如下,其中A可逆:A^{-1}=\frac{A^*}{|A|},其中A^*是A的伴隨矩陣。。
1.給定一個方陣,非奇異(不是也可,程序有考慮);
2.由矩陣得到其行列式,求其值如|A|;
3.求其伴隨矩陣A^*;
4.得到其逆矩陣。
主要函數如下:
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
|
//得到給定矩陣src的逆矩陣保存到des中。 bool GetMatrixInverse( double src[N][N], int n, double des[N][N]) { double flag=getA(src,n); double t[N][N]; if (flag==0) { return false ; } else { getAStart(src,n,t); for ( int i=0;i<n;i++) { for ( int j=0;j<n;j++) { des[i][j]=t[i][j]/flag; } } } return true ; } |
計算|A|:
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
|
//按第一行展開計算|A| double getA( double arcs[N][N], int n) { if (n==1) { return arcs[0][0]; } double ans = 0; double temp[N][N]={0.0}; int i,j,k; for (i=0;i<n;i++) { for (j=0;j<n-1;j++) { for (k=0;k<n-1;k++) { temp[j][k] = arcs[j+1][(k>=i)?k+1:k]; } } double t = getA(temp,n-1); if (i%2==0) { ans += arcs[0][i]*t; } else { ans -= arcs[0][i]*t; } } return ans; } |
計算伴隨矩陣:
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
|
//計算每一行每一列的每個元素所對應的余子式,組成A* void getAStart( double arcs[N][N], int n, double ans[N][N]) { if (n==1) { ans[0][0] = 1; return ; } int i,j,k,t; double temp[N][N]; for (i=0;i<n;i++) { for (j=0;j<n;j++) { for (k=0;k<n-1;k++) { for (t=0;t<n-1;t++) { temp[k][t] = arcs[k>=i?k+1:k][t>=j?t+1:t]; } } ans[j][i] = getA(temp,n-1); if ((i+j)%2 == 1) { ans[j][i] = - ans[j][i]; } } } } |
到此這篇關于C++矩陣運算的實現簡單的文章就介紹到這了,更多相關C++ 矩陣運算內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/victor_JZ/article/details/120069521