C語(yǔ)言求逆矩陣案例詳解
一般求逆矩陣的方法有兩種,伴隨陣法和初等變換法。但是這兩種方法都不太適合編程。伴隨陣法的計(jì)算量大,初等變換法又難以編程實(shí)現(xiàn)。
適合編程的求逆矩陣的方法如下:
- 對(duì)可逆矩陣A進(jìn)行QR分解:A=QR
- 求上三角矩陣R的逆矩陣
- 求出A的逆矩陣:A^(-1)=R^(-1)Q^(H)
以上三步都有具體的公式與之對(duì)應(yīng),適合編程實(shí)現(xiàn)。
C語(yǔ)言實(shí)現(xiàn)代碼:
#include <stdio.h> #include <math.h> #define SIZE 8 double b[SIZE][SIZE]={0};//應(yīng)該讀作“貝爾塔”,注釋中用B表示 double t[SIZE][SIZE]={0};//求和的那項(xiàng) double Q[SIZE][SIZE]={0};//正交矩陣 double QH[SIZE][SIZE]={0};//正交矩陣的轉(zhuǎn)置共軛 double R[SIZE][SIZE]={0};// double invR[SIZE][SIZE]={0};//R的逆矩陣 double invA[SIZE][SIZE]={0};//A的逆矩陣,最終的結(jié)果 //={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 }; /*/ 函數(shù)名:int main() 輸入: 輸出: 功能:求矩陣的逆 pure C language 首先對(duì)矩陣進(jìn)行QR分解之后求上三角矩陣R的逆陣最后A-1=QH*R-1,得到A的逆陣。 作者:HLdongdong *////////////////////////////////////////////////////////////////////// int main() { int i;//數(shù)組 行 int j;//數(shù)組 列 int k;//代表B的角標(biāo) int l;//數(shù)組 列 double dev; double numb;//計(jì)算的中間變量 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 !!! } } } } ///////////////////對(duì)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"); } ////////////////////結(jié)果和MATLAB差一個(gè)負(fù)號(hào),神馬鬼????????///////////////////// /////////////////////求QH////////////////////////// for(i=0;i<SIZE;++i)//實(shí)矩陣就是轉(zhuǎn)置 { 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"); } ///////////////////////結(jié)果與MATLAB的結(jié)果在千分位后有出入,但是負(fù)號(hào)都是對(duì)的^v^/////////////////////////// return 0; }
另附上矩陣乘法的子函數(shù)
/*/ 函數(shù)名: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]; } } } }
到此這篇關(guān)于C語(yǔ)言求逆矩陣案例詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言求逆矩陣內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言線性代數(shù)算法實(shí)現(xiàn)矩陣示例代碼
- C語(yǔ)言實(shí)現(xiàn)矩陣運(yùn)算案例詳解
- C語(yǔ)言中楊氏矩陣與楊輝三角的實(shí)現(xiàn)方法
- C語(yǔ)言實(shí)現(xiàn)圖的鄰接矩陣存儲(chǔ)操作
- C語(yǔ)言實(shí)現(xiàn)兩個(gè)矩陣相乘
- C語(yǔ)言矩陣連乘 (動(dòng)態(tài)規(guī)劃)詳解
- C語(yǔ)言實(shí)現(xiàn)矩陣翻轉(zhuǎn)(上下翻轉(zhuǎn)、左右翻轉(zhuǎn))
- C語(yǔ)言求矩陣的各列元素之和的代碼示例
- 詳解C語(yǔ)言通過(guò)遞歸與非遞歸實(shí)現(xiàn)蛇形矩陣
相關(guān)文章
C++小游戲教程之猜數(shù)游戲的實(shí)現(xiàn)
這篇文章主要和大家詳細(xì)介紹如何利用C++做一個(gè)簡(jiǎn)易的猜數(shù)游戲,分為用戶猜數(shù)和系統(tǒng)猜數(shù)。文中的示例代碼講解詳細(xì) ,感興趣的小伙伴可以嘗試一下2022-11-11C語(yǔ)言中g(shù)etchar的用法以及實(shí)例解析
getchar()是stdio.h中的庫(kù)函數(shù),它的作用是從stdin流中讀入一個(gè)字符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中g(shù)etchar的用法以及實(shí)例的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03如何用C語(yǔ)言、Python實(shí)現(xiàn)棧及典型應(yīng)用
本文先通過(guò)實(shí)例分別介紹了如何用C語(yǔ)言、Python實(shí)現(xiàn)棧,后又介紹棧的典型應(yīng)用,對(duì)大家學(xué)習(xí)棧很有借鑒參考價(jià)值,下面一起來(lái)看看吧。2016-08-08詳解state狀態(tài)模式及在C++設(shè)計(jì)模式編程中的使用實(shí)例
這篇文章主要介紹了state狀態(tài)模式及在C++設(shè)計(jì)模式編程中的使用實(shí)例,在設(shè)計(jì)模式中策略用來(lái)處理算法變化,而狀態(tài)則是透明地處理狀態(tài)變化,需要的朋友可以參考下2016-03-03C語(yǔ)言遞歸之漢諾塔和青蛙跳臺(tái)階問(wèn)題
這篇文章主要介紹了C語(yǔ)言遞歸之漢諾塔問(wèn)題和青蛙跳臺(tái)階問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04