您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關C++如何實現矩陣運算,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
利用C++實現矩陣的構造,通過運算符的重載實現矩陣的乘法、加法等。并且實現矩陣形狀的打印,矩陣的打印。
#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.得到其逆矩陣。
主要函數如下:
//得到給定矩陣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|:
//按第一行展開計算|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; }
計算伴隨矩陣:
//計算每一行每一列的每個元素所對應的余子式,組成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++如何實現矩陣運算”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。