软件注册站
热情软件屋

 
矩阵求逆的算法
编号: QA004044    
建立日期: 2001年3月27日 最后修改日期: 2005年8月22日
所属类别: C/C++ - 其他方面
   
    操作系统: win98
    编程工具: vc++ 6
    问题: 矩阵求逆的算法
    水平: 中级(王钦军)
   
    矩阵求逆一般使用Gauss-Jordan消去法。具体程序可以参考徐士良编的《C语言常用算法程序集》(清华大学出版社出版,ISBN 7-302-02290-9)或Template Numerical Toolkit(http://math.nist.gov/tnt/index.html)。
    
    自由马的意见:
    如果是对称正定矩阵,采用ldl分解更为快速有效。
    
    askye的意见:
    用C写的,做成DLL使用很方便。
    double * MatrixOpp(double A[],int m,int n) /*矩阵求逆*/
    
{
    
int i,j,x,y,k;
    
double *SP=NULL,*AB=NULL,*B=NULL,X,*C;
    
SP=(double *)malloc(m*n*sizeof(double));
    
AB=(double *)malloc(m*n*sizeof(double));
    
B=(double *)malloc(m*n*sizeof(double));
    
    
X=Surplus(A,m,n);
    
X=1/X;
    
    
for(i=0;i<m;i++)
    
for(j=0;j<n;j++)
    
{for(k=0;k<m*n;k++)
    
B[k]=A[k];
    
{for(x=0;x<n;x++)
    
B[i*n+x]=0;
    
for(y=0;y<m;y++)
    
B[m*y+j]=0;
    
B[i*n+j]=1;
    
SP[i*n+j]=Surplus(B,m,n);
    
AB[i*n+j]=X*SP[i*n+j];
    
}
    
}
    
C=MatrixInver(AB,m,n);
    
    
return C;
    
}
    
    
double * MatrixInver(double A[],int m,int n) /*矩阵转置*/
    
{
    
int i,j;
    
double *B=NULL;
    
B=(double *)malloc(m*n*sizeof(double));
    
    
for(i=0;i<n;i++)
    
for(j=0;j<m;j++)
    
B[i*m+j]=A[j*n+i];
    
    
return B;
    
}
    
    
double Surplus(double A[],int m,int n) /*求矩阵行列式*/
    
{
    
    
int i,j,k,p,r;
    
double X,temp=1,temp1=1,s=0,s1=0;
    
    
if(n==2)
    
{for(i=0;i<m;i++)
    
for(j=0;j<n;j++)
    
if((i+j)%2) temp1*=A[i*n+j];
    
else temp*=A[i*n+j];
    
X=temp-temp1;}
    
else{
    
for(k=0;k<n;k++)
    
{for(i=0,j=k;i<m,j<n;i++,j++)
    
temp*=A[i*n+j];
    
if(m-i)
    
{for(p=m-i,r=m-1;p>0;p--,r--)
    
temp*=A[r*n+p-1];}
    
s+=temp;
    
temp=1;
    
}
    
    
for(k=n-1;k>=0;k--)
    
{for(i=0,j=k;i<m,j>=0;i++,j--)
    
temp1*=A[i*n+j];
    
if(m-i)
    
{for(p=m-1,r=i;r<m;p--,r++)
    
temp1*=A[r*n+p];}
    
s1+=temp1;
    
temp1=1;
    
}
    
    
X=s-s1;}
    
return X;
    
}
    

    
    encounter2001的意见:
    二阶三阶没问题。四阶以上行列式求解有问题,四阶行列式求解须根据求和式中的每项的逆序数来确定它正负号。
    
    maxt的意见:
    askye的程序高阶有错误,验证未通过,建议慎重使用。
    
    Cindy的意见:
    参照MATLAB中的m文件:inv.m

    

此问题由李海回答。

附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, 其他方面,

   
 
把这个问题推荐给朋友
   
 
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio