C語言求逆矩陣案例詳解
更新時間:2021年08月16日 09:09:38 作者:dogdng
這篇文章主要介紹了C語言求逆矩陣案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
一般求逆矩陣的方法有兩種,伴隨陣法和初等變換法。但是這兩種方法都不太適合編程。伴隨陣法的計算量大,初等變換法又難以編程實現(xiàn)。
適合編程的求逆矩陣的方法如下:
- 對可逆矩陣A進行QR分解:A=QR
- 求上三角矩陣R的逆矩陣
- 求出A的逆矩陣:A^(-1)=R^(-1)Q^(H)
以上三步都有具體的公式與之對應,適合編程實現(xiàn)。
C語言實現(xiàn)代碼:
#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
};
/*/
函數(shù)名:int main()
輸入:
輸出:
功能:求矩陣的逆 pure C language
首先對矩陣進行QR分解之后求上三角矩陣R的逆陣最后A-1=QH*R-1,得到A的逆陣。
作者:HLdongdong
*//////////////////////////////////////////////////////////////////////
int main()
{
int i;//數(shù)組 行
int j;//數(shù)組 列
int k;//代表B的角標
int l;//數(shù)組 列
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;
}
另附上矩陣乘法的子函數(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];
}
}
}
}
到此這篇關于C語言求逆矩陣案例詳解的文章就介紹到這了,更多相關C語言求逆矩陣內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++實現(xiàn)LeetCode(80.有序數(shù)組中去除重復項之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(80.有序數(shù)組中去除重復項之二),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07

