function qiuni =INV_GET(a)
N=length(a);
M=eye(N);
%得到上三角矩?
for i=1:N
max=a(i,i);
A=i;
for j=i+1:N
if(abs(a(j,i))>abs(max))%找最大值
max=a(j,i);
A=j;
end
end
for m=1:N
temp1=a(i,m);%交換最大值值所在的行和當前行
a(i,m)=a(A,m);
a(A,m)=temp1;
temp2=M(i,m);
M(i,m)=M(A,m);
M(A,m)=temp2;
end
for k=i+1:N
jiaquan=a(k,i)/a(i,i);%其他行加權得到上三角
for n=1:N
a(k,n)=a(k,n)-jiaquan*a(i,n);
M(k,n)=M(k,n)-jiaquan*M(i,n);
end
end
end
temp3=a;
%得到單位矩陣
for s=N:-1:1
xishu1 =a(s,s);
for p=s:N
a(p,s)=a(p,s)/xishu1;
end
for q=1:N
M(s,q)=M(s,q)/xishu1;
end
for w=s-1:-1:1
xishu=a(w,s);
a(w,s)=0;
for t=1:N
M(w,t)=M(w,t)-xishu*M(s,t);
end
end
end
temp2=a;
qiuni=M;
參考的c語言程序和注釋
#include<stdio.h>
#include<math.h>
long int const N=1000; //定義矩陣最大為1000階
int n; //n表示矩陣的行數和列數。
double juzhen[N][N]; //定義一個1000階矩陣
double danwei[N][N]; //定義一個單位矩陣
bool zhaozuidazhi(int s)//定義一個布爾型從s行到n行選擇最大的元素作為主元的函數。
{
int i,j,A;
double mas,temp; //temp為中間變量,實現行交換
mas=fabs(juzhen[s][s]); //數學函數:fabs 功能:求浮點數juzhen[s][s]的絕對值
//計算juzhen[s][s], 當juzhen[s][s]不為負時返回juzhen[s][s],否則返回-juzhen[s][s]
A=s;
for(i=s+1;i<n;i++)
{
if(mas<fabs(juzhen[i][s]))
{
mas=fabs(juzhen[i][s]);
A=i;
}
}
if(mas==0)
return false;
//交換兩行
for(j=0;j<n;j++)
{
temp=juzhen[s][j];
juzhen[s][j]=juzhen[A][j];
juzhen[A][j]=temp;
temp=danwei[s][j];
danwei[s][j]=danwei[A][j];
danwei[A][j]=temp;
}
return true;
}
void jisuan(int s) //消元計算
{
int i,j;
double mas=juzhen[s][s],r;
for(i=s+1;i<n;i++)
{
r=juzhen[i][s]/mas;
for(j=0;j<n;j++)
{ //利用消元計算方陣使之成為上三角矩陣,最后使主對角線上的元素相乘就是最終結果
juzhen[i][j]=juzhen[i][j]-juzhen[s][j]*r;
danwei[i][j]=danwei[i][j]-danwei[s][j]*r;
}
}
}
void HH(int s)
{
int i,j;
double mas;
mas=juzhen[s][s];
for(i=s;i<n;i++)
juzhen[s][i]=juzhen[s][i]/mas;
for(i=0;i<n;i++)
danwei[s][i]=danwei[s][i]/mas;
for(i=s-1;i>=0;i--)
{
mas=juzhen[i][s];
juzhen[i][s]=0;
for(j=0;j<n;j++)
danwei[i][j]=danwei[i][j]-mas*danwei[s][j];
}
}
int main()
{
int i,j;
zl: printf("第一行輸入矩陣的階數,然后回車輸入原始矩陣:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j) danwei[i][j]=1;
else danwei[i][j]=0;
scanf("%lf",&juzhen[i][j]);//C語言的函數參數是傳值而不是傳引用的,
//通常函數無法修改和操作參數.scanf可以修改參數的原因是傳給scanf的
// 那個參數是一個指針,scanf通過傳過來的指針來修改指針指向的內容。所以,
//把x取地址再傳過去。&是取juzhen[i][j]的地址,%lf是說juzhen[i][j]是一個雙精度浮點型.
}
}
//將原始矩陣轉成上三角矩陣
for(i=0;i<n-1;i++)
{
//每一次選一個絕對值最大的值作為a[i]即主元
if(zhaozuidazhi(i)) //函數調用
{
jisuan(i); //函數調用
}
else
{
printf("該矩陣不可逆");//高斯消去法不能將原始矩陣化為三角形的格式,
//那就代表原始矩陣是一個不可逆的矩陣,
return 0;
}
}
//將原始矩陣轉化成單位矩陣
for(i=n-1;i>=0;i--)
{
HH(i);
}
printf("\n原始矩陣的逆矩陣為:\n");//輸出逆矩陣語句
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%.2lf ",danwei[i][j]);//%.2lf在printf()里表示按下面格式
// 輸出一個long double型數:整數部分輸出全部輸出小數部分輸出2位,
//沒有小數的輸出兩個0,不足兩位的后面補0,大於兩位的截短到兩位。
//測試結果會出現兩位小數
printf("\n");
}
goto zl;
}