求矩阵的逆
1 //*************************** 2 //求任何一个矩阵的逆矩阵 3 //*************************** 4 #include <stdio.h> 5 #include <malloc.h> 6 7 void main( void ) 8 { 9 float *buffer,*p; //定义数组首地址指针变量 10 short int row,num; //定义矩阵行数row及矩阵元素个数 11 short int i,j; 12 float determ; //定义矩阵的行列式 13 14 float comput_D(float *p,short int n); //求矩阵的行列式 15 float Creat_M(float *p, short int m,short int n,short int k); //求代数余子式 16 void Print( float *p,short int n); //打印n×n的矩阵 17 18 printf("\nPlease input the number of rows: "); 19 scanf("%d",&row); 20 21 num=2 * row * row; 22 buffer = (float *)calloc(num, sizeof(float)); //分配内存单元 23 24 p=buffer; 25 if(p != NULL) 26 { 27 for(i=0;i<row;i++) //输入各单元值 28 { 29 printf("Input the number of %d row ",i+1); 30 for(j=0;j<row;j++) 31 { 32 scanf("%f",p++); 33 } 34 } 35 } 36 else 37 printf( "Can't allocate memory\n" ); 38 39 printf("\nThe original matrix is:\n"); 40 Print(buffer,row); //打印该矩阵 41 42 determ=comput_D(buffer,row); //求整个矩阵的行列式 43 p=buffer + row * row; 44 if (determ != 0) 45 { 46 for (i=0;i<row; i++) //求逆矩阵 47 for (j=0; j<row; j++) 48 *(p+j*row+i)= Creat_M(buffer,i,j,row)/determ; 49 50 printf("The determinant is %G\n",determ); 51 52 p=buffer + row * row; 53 printf("\nThe inverse matrix is:\n"); 54 Print(p,row); //打印该矩阵 55 } 56 else 57 printf("The determnant is 0, and there is no inverse matrix !\n"); 58 free( buffer ); 59 } 60 //-------------------------------------------------------- 61 //功能:求矩阵 n X n 的行列式 62 //入口参数:矩阵首地址 p;矩阵行数 n 63 //返回值:矩阵的行列式值 64 //-------------------------------------------------------- 65 float comput_D(float *p,short int n) 66 { 67 short int i,j,m; //i--row; j--column 68 short int lop=0; 69 float result=0; 70 float mid=1; 71 72 if (n!=1) 73 { 74 lop=(n==2)?1:n; //控制求和循环次数,若为2阶,则循环1次,否则为n次 75 76 for(m=0;m<lop;m++) 77 { 78 mid=1; //顺序求和 79 for(i=0,j=m;i<n;i++,j++) 80 mid = mid * ( *(p+i*n+j%n) ); 81 result+=mid; 82 } 83 84 for(m=0;m<lop;m++) 85 { 86 mid=1; //逆序相减 87 for(i=0,j=n-1-m+n; i<n; i++,j--) 88 mid=mid * ( *(p+i*n+j%n)); 89 result-=mid; 90 } 91 } 92 else result=*p; 93 return(result); 94 } 95 //---------------------------------------------------- 96 //功能:求k×k矩阵中元素A(mn)的代数余子式 97 //入口参数:k×k矩阵首地址;元素A的下标m,n; 矩阵行数 k 98 //返回值: k×k矩阵中元素A(mn)的代数余子式 99 //---------------------------------------------------- 100 float Creat_M(float *p, short int m,short int n,short int k) 101 { 102 short int len; 103 short int i,j; 104 float mid_result=0; 105 short int quo=1; 106 float *p_creat,*p_mid; 107 108 len=(k-1)*(k-1); 109 p_creat = (float *)calloc(len, sizeof(float)); //分配内存单元 110 p_mid=p_creat; 111 for(i=0;i<k;i++) 112 for(j=0;j<k;j++) 113 { 114 if (i!=m && j!=n) 115 *p_mid++ =* (p+i*k+j); 116 } 117 // Print(p_creat,k-1); 118 quo = (m + n) %2==0 ? 1:-1; 119 mid_result = (float ) quo * comput_D(p_creat,k-1); 120 free(p_creat); 121 return(mid_result); 122 } 123 //------------------------------------------- 124 //功能:打印n×n的矩阵 125 //入口参数:n×n矩阵的首地址;该矩阵的行数 n 126 //返回值: 无 127 //------------------------------------------- 128 void Print( float *p,short int n) 129 { 130 int i,j; 131 for (i=0;i<n;i++) 132 { 133 for (j=0; j<n;j++) 134 printf("%10G ",*p++); 135 printf("\n"); 136 } 137 printf("--------------\n"); 138 }