C語言求逆矩陣案例詳解
一般求逆矩陣的方法有兩種,伴隨陣法和初等變換法。但是這兩種方法都不太適合編程。伴隨陣法的計算量大,初等變換法又難以編程實現。
適合編程的求逆矩陣的方法如下:
- 對可逆矩陣A進行QR分解:A=QR
- 求上三角矩陣R的逆矩陣
- 求出A的逆矩陣:A^(-1)=R^(-1)Q^(H)
以上三步都有具體的公式與之對應,適合編程實現。
C語言實現代碼:
#include <stdio.h> #include <math.h> #define SIZE 8 double b[SIZE][SIZE]={0};//應該讀作“貝爾塔”,註釋中用B表示 double t[SIZE][SIZE]={0};//求和的那項 double Q[SIZE][SIZE]={0};//正交矩陣 double QH[SIZE][SIZE]={0};//正交矩陣的轉置共軛 double R[SIZE][SIZE]={0};// double invR[SIZE][SIZE]={0};//R的逆矩陣 double invA[SIZE][SIZE]={0};//A的逆矩陣,最終的結果 //={0};// double matrixR1[SIZE][SIZE]={0}; double matrixR2[SIZE][SIZE]={0}; //double init[3][3]={3,14,9,6,43,3,6,22,15}; double init[8][8]={ 0.0938 , 0.5201 , 0.4424 , 0.0196 , 0.3912 , 0.9493 , 0.9899 , 0.8256, 0.5254 , 0.3477 , 0.6878 , 0.3309 , 0.7691 , 0.3276 , 0.5144 , 0.7900, 0.5303 , 0.1500 , 0.3592 , 0.4243 , 0.3968 , 0.6713 , 0.8843 , 0.3185, 0.8611 , 0.5861 , 0.7363 , 0.2703 , 0.8085 , 0.4386 , 0.5880 , 0.5341, 0.4849 , 0.2621 , 0.3947 , 0.1971 , 0.7551 , 0.8335 , 0.1548 , 0.0900, 0.3935 , 0.0445 , 0.6834 , 0.8217 , 0.3774 , 0.7689 , 0.1999 , 0.1117, 0.6714 , 0.7549 , 0.7040 , 0.4299 , 0.2160 , 0.1673 , 0.4070 , 0.1363, 0.7413 , 0.2428 , 0.4423 , 0.8878 , 0.7904 , 0.8620 , 0.7487 , 0.6787 }; /*/ 函數名:int main() 輸入: 輸出: 功能:求矩陣的逆 pure C language 首先對矩陣進行QR分解之後求上三角矩陣R的逆陣最後A-1=QH*R-1,得到A的逆陣。 作者:HLdongdong *////////////////////////////////////////////////////////////////////// int main() { int i;//數組 行 int j;//數組 列 int k;//代表B的角標 int l;//數組 列 double dev; double numb;//計算的中間變量 double numerator,denominator; double ratio; /////////////////求B///////////////// for(i=0;i<SIZE;++i) { for(j=0;j<SIZE;++j) { b[j][i]=init[j][i]; } for(k=0;k<i;++k) { if(i) { numerator=0.0; denominator=0.0; for(l=0;l<SIZE;++l) { numerator+=init[l][i]*b[l][k]; denominator+=b[l][k]*b[l][k]; } dev=numerator/denominator; t[k][i]=dev; for(j=0;j<SIZE;++j) { b[j][i]-=t[k][i]*b[j][k];//t init =0 !!! } } } } ///////////////////對B單位化,得到正交矩陣Q矩陣//////////////////// for(i=0;i<SIZE;++i) { numb=0.0; for(j=0;j<SIZE;++j) { numb+=(b[j][i]*b[j][i]); } dev=sqrt(numb); for(j=0;j<SIZE;++j) { Q[j][i]=b[j][i]/dev; } matrixR1[i][i]=dev; } /////////////////////求上三角R陣/////////////////////// for(i=0;i<SIZE;++i) { for(j=0;j<SIZE;++j) { if(j<i) { matrixR2[j][i]=t[j][i]; } else if(j==i) { matrixR2[j][i]=1; } else { matrixR2[j][i]=0; } } } mulMatrix(matrixR1,matrixR2,SIZE,SIZE,SIZE,R); ///////////////////////QR分解完畢////////////////////////// printf("QR分解:\n"); printf("Q=\n"); for(i=0;i<SIZE;++i) { for(j=0;j<SIZE;++j) { printf("%2.4f ",Q[i][j]); // } printf("\n"); } printf("R=\n"); for(i=0;i<SIZE;++i) { for(j=0;j<SIZE;++j) { printf("%2.4f ",R[i][j]); // } printf("\n"); } /////////////////////求R的逆陣////////////////////////// for(i=SIZE-1;i>=0;--i) { invR[i][i]=1/R[i][i]; //R[i][i]=invR[i][i]; if(i!=(SIZE-1))//向右 { for(j=i+1;j<SIZE;++j) { invR[i][j]=invR[i][j]*invR[i][i]; R[i][j]=R[i][j]*invR[i][i]; } } if(i)//向上 { for(j=i-1;j>=0;--j) { ratio=R[j][i]; for(k=i;k<SIZE;++k) { invR[j][k]-=ratio*invR[i][k]; R[j][k]-=ratio*R[i][k]; } } } } /////////////////////////////////////////////////////// printf("inv(R)=\n"); for(i=0;i<SIZE;++i) { for(j=0;j<SIZE;++j) { printf(" %2.4f ",invR[i][j]); // } printf("\n"); } ////////////////////結果和MATLAB差一個負號,神馬鬼????????///////////////////// /////////////////////求QH////////////////////////// for(i=0;i<SIZE;++i)//實矩陣就是轉置 { for(j=0;j<SIZE;++j) { QH[i][j]=Q[j][i]; } } ///////////////////////求A的逆陣invA///////////////////////////// mulMatrix(invR,QH,SIZE,SIZE,SIZE,invA); printf("inv(A)=\n"); for(i=0;i<SIZE;++i) { for(j=0;j<SIZE;++j) { printf(" %2.4f ",invA[i][j]); // } printf("\n"); } ///////////////////////結果與MATLAB的結果在千分位後有出入,但是負號都是對的^v^/////////////////////////// return 0; }
另附上矩陣乘法的子函數
/*/ 函數名:void mulMatrix(double matrix1[SIZE][SIZE],double matrix2[SIZE][SIZE],int high1,int weight,int weight2,double mulMatrixOut[SIZE][SIZE]) 輸入:依次是 左矩陣,右矩陣,左矩陣高度,左矩陣寬度,右矩陣寬度,輸出矩陣 輸出: 功能:矩陣乘法 作者:HLdongdong *// void mulMatrix(double matrix1[SIZE][SIZE],double matrix2[SIZE][SIZE],int high1,int weight,int weight2,double mulMatrixOut[SIZE][SIZE]) { int i,j,k; for(i=0;i<high1;++i) { for(j=0;j<weight2;j++) { for(k=0;k<weight;++k) { mulMatrixOut[i][j]+=matrix1[i][k]*matrix2[k][j]; } } } }
到此這篇關於C語言求逆矩陣案例詳解的文章就介紹到這瞭,更多相關C語言求逆矩陣內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!