n次逆行列を計算するC言語実装


#include
int main ()
{
     
    int n,i,j,p,a,b,q;

    printf("Enter value n:\t");//    n// 
	scanf("%d",&n);
    double A[n][n],B[n-1][n-1],C[n][n],D[n][n];//A     ,B A    ,C A     (   ),D A     A//
	double det(double*p,int n);

    printf("Enter the array A:
"
);// // for(i=0;i<n;i++) { for(j=0;j<n;j++) scanf("%lf",&A[i][j]); } printf("

The array you enter:
"
);//print original array/ for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%10lf\t",A[i][j]); printf("

"
); } //(n-1)array to a new array// for(i=0;i<n;i++) { for(j=0;j<n;j++) { for(p=0,a=0;p<n;p++) { if(p!=i) { for(q=0,b=0;q<n;q++) { if(q!=j) { B[a][b]=A[p][q]; if((i+j)%2==0) C[i][j]=det(B,n-1);//forget *(-1)// else C[i][j]=-det(B,n-1); b++; } } a++; } } } }// end// for(i=0;i<n;i++) { for(j=0;j<n;j++) D[j][i]=C[i][j]; } double result; result=det(A,n); if(result==0) { printf("The inverse of the array is not exist.


"
); } else { printf("

The inverse of the array :
"
); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%10lf\t",D[i][j]/result); printf("

"
); } } return 0; } //det A// double det(double*p,int n) { int x,k,i,j; double t,h,det; double A[n][n],C[n][n]; for(i=0;i<n;i++) { for(j=0;j<n;j++) A[i][j]= *(p+i+n*j); } // // for(j=0;j<n-1;j++)// // { for(i=n-1,t=0;i>=j;i--) { if(A[i][j]!=0) { t=A[i][j]; x=i; } } if(t!=0) { for(h=0,i=n-1;i>=j+1;i--) { if(i!=x) { h=A[i][j]; for(k=0;k<n;k++) { A[i][k]-=h*A[x][k]/t;//error?// } } } } } for(i=0;i<n;i++)// // { for(j=0;j<n;j++) { C[i][j]=A[n-j-1][n-i-1]; } } for(j=0;j<n-1;j++)// 2 // { for(i=n-1,t=0;i>=j;i--) { if(C[i][j]!=0) { t=C[i][j]; x=i; } } if(t!=0) { for(i=n-1;i>=j+1;i--) { h=C[i][j]; if(i!=x) { for(k=0;k<n;k++) { C[i][k]-=h*C[x][k]/t;//error// } } } } } for(i=0;i<n;i++)// // { for(j=0;j<n;j++) { A[i][j]=C[n-j-1][n-i-1]; } } for(det=1,i=0;i<n;i++) { det*=A[i][i]; } return (det); //end det// }