<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
一般求逆矩陣的方法有兩種,伴隨陣法和初等變換法。但是這兩種方法都不太適合程式設計。伴隨陣法的計算量大,初等變換法又難以程式設計實現。
適合程式設計的求逆矩陣的方法如下:
以上三步都有具體的公式與之對應,適合程式設計實現。
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語言求逆矩陣內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45