資源簡介
在做TPS時用到了兩種矩陣求逆的方法,都是適合大型矩陣求逆的方法,一個是高斯約旦法,還有是依照大一線性代數中的增廣矩陣法求解,復雜度都是n的三次方。

代碼片段和文件信息
#include?“matrix_diy.h“
using?namespace?std;
double?**?muti(double?**Mint?M_rowint?M_coldouble?**Nint?N_rowint?N_col)//矩陣乘法
{
double?**ans;
ans=new?double?*[M_col];??//分配空間
for(int?i=0;i ans[i]=new?double[N_row];
if(M_row!=N_col)????//出錯
return?NULL;
for(int?i=0;i {??
????????for(int?j=0;j {??
????????????ans[i][j]=0;//初始化?
????????????for(int?k=0;k ????????????????ans[i][j]+=M[i][k]*N[k][j];??
????????????}??
????????}??
????}?
return(ans);
}
double?**T(double?**Mint?M_rowint?M_col)//矩陣轉置
{
double?**ans;
ans=new?double?*[M_row];??//分配空間
for(int?i=0;i ans[i]=new?double[M_col];
for(int?i=0;i for(int?j=0;j ans[i][j]=M[j][i];
return?(ans);
}
double?**inverse1(double?**M1int?M1_col)//矩陣的逆用增廣矩陣求解
{
int?n=M1_col;
double**ans;?????//為結果分配空間,作為返回值
ans=new?double?*[n];
for(int?i=0;i ans[i]=new?double[n];
double**M;?????//為結果分配空間,作為中間值
M=new?double?*[n];
for(int?i=0;i M[i]=new?double[2*n];???//增廣矩陣
for(int?i=0;i {
for(int?j=0;j {
M[i][j]=M1[i][j];?
}
for(int?j=n;j<2*n;j++)
{
if(i==j-n)M[i][j]=1;
else?M[i][j]=0;
}
}
int?flag1=0;
int?flag2=0;
for(int?k=0;k {
if(M[k][k]==0.0)??//零
{
for(int?s=k+1;s {
???if(M[s][k]==0.0)continue;
???else??
{//?找到不為零的數
flag2=s;
double?tmp=0;
//和該行做行交換
????????????for(int?j=k;j<2*n;j++)
?????????????????{
?????????????????tmp=M[k][j];
?????????????????M[k][j]=M[flag2][j];
?????????????????M[flag2][j]=tmp;
??????????????}
break;
????}
}
if(M[k][k]==0.0)continue;
}
if(fabs(M[k][k])==0.0)??//近似于零
cout<<“ERROR“<<“奇異“< for(int?i=k+1;i {
double?q=M[i][k]/M[k][k];
for(int?j=k;j<2*n;j++)
M[i][j]=M[i][j]-M[k][j]*q;????//?先變成上三角矩陣
for(int?j=0;j {
????if(fabs(M[i][j])<1e-10)??????//過小則近似于0
M[i][j]=0;
}
}
}
for(int?k=n-1;k>0;k--)
{
if(M[k][k]==0.0)??//主元為零
{
for(int?s=k-1;s>0;s--)
{
???if(M[s][k]!=0.0)
{//?找到不為零的數
flag1=s;
double?tmp=0;
//和該行做行交換
????????????for(int?j=0;j<2*n;j++)
?????????????????{
?????????????????tmp=M[k][j];
?????????????????M[k][j]=M[flag1][j];
?????????????????M[flag1][j]=tmp;
??????????????}
break;
????}
}
if(fabs(M[k][k])==0.0)continue;
}
for(int?i=k-1;i>=0;i--)
{
double?q=M[i][k]/M[k][k];
for(int?j=k;j<2*n;j++)
M[i][j]=M[i][j]-M[k][j]*q;????//?再變成全是主元的矩陣
for(int?j=0;j {
????if(fabs(M[i][j])<1e-10)??????//過小則近似于0
M[i][j]=0;
}
}
}
for(int?i=0;i {
double?ik=M[i][i];
for(int?j=0;j<2*n;j++)
M[i][j]=M[i][j]/ik;???????????????????????//左邊的矩陣變成I矩陣了,則右邊的矩陣即為逆
}
for(int?i=0;i for(int?j=0;j ans[i][j]=M[i][j+n];
??for?(int?i=0;i
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????????377??2018-11-12?20:25??matrix_diy.h
?????文件????????5822??2018-11-20?21:06??matrix_diy.cpp
- 上一篇:STM32F412工程模板
- 下一篇:Gojs設備線路高亮Demo
評論
共有 條評論