// X 原 Y输出 Z余子式临时空间
int DMatrix_Rev( Dmatrix_t *X, Dmatrix_t *Y, Dmatrix_t *Z )
{
double val,val_z,*Xp,*Yp,*Zp;
int i,j,m,n,k,k_ou;
if(X->hang!= X->lie ) return 0;
if(X->hang==0) return 0;
Y->lie = X->lie; Y->hang = X->hang;
memcpy(Y->datap,X->datap,X->hang*X->hang*sizeof(double));
if( 0== DMatrix_Det(Y,&val) ) return 0;
if(val==0) return 0;
if(X->hang==1 )
{
*Y->datap = 1.0/ *X->datap ;
return 1;
}
val=1/val;
Z->hang=X->hang-1;
Z->lie =X->lie-1;
k=1;// -1下标之和的次方, 奇数阶 一直*-1 ,偶数阶 换行多乘-1
k_ou=(X->hang&0x01 )?1:-1;//奇数阶 一直*-1 ,偶数阶 换行多乘-1
Yp= Y->datap;
for(i=0;i<X->hang;i++ )
{
Yp= Y->datap+i;
for(j=0;j<X->hang;j++ )
{
Xp= X->datap;
Zp= Z->datap;
for(m=0;m<X->hang;m++)
{
for(n=0;n<X->hang;n++)
{
if((m!=i)&&(n!=j))//构造余子式
{
*Zp++ = *Xp;
}
Xp++;
}
}
DMatrix_Det(Z,&val_z);
*Yp = (double )k * val_z*val;
Yp+=X->hang; // 注意结论有个转置关系
k*=-1;
}
k*=k_ou;
}
return 1;
}