/* File name 11-3.c */ #include <stdio.h> #define BUFFSIZE 1000 double matrix[4][8]={{0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}}; void inverse(); void swap(int i, int j); void setpivot(int i); void eliminate(int i); main() { int i; char input[BUFFSIZE]; for (i=0; i< 4; i++){ printf("Input the %dth row.\n", i+1); fgets(input, BUFFSIZE, stdin); sscanf(input, "%lf %lf %lf %lf", &matrix[i][0], &matrix[i][1], &matrix[i][2], &matrix[i][3]); } inverse(); printf("Inverse matrix is\n"); for(i=0; i< 4; i++) printf("%f %f %f %f\n", matrix[i][4], matrix[i][5], matrix[i][6], matrix[i][7]); } void inverse() { int i; for(i=0; i < 4; i++){ setpivot(i); eliminate(i); } } void setpivot(int i) { int j; if (matrix[i][i]!=0) return; for (j=i+1; j < 4; j++){ if (matrix[j][i]!=0){ swap(i, j); return; } } printf("The matrix does not have the inverse.\n"); exit(1); } void swap(int i, int j) { int k; double temp; for (k=i; k< 8; k++){ temp=matrix[i][k]; matrix[i][k]=matrix[j][k]; matrix[j][k]=temp; } } void eliminate(int i) { int k; int j; double denominator=matrix[i][i]; double multiplier; for (j=i; j<8;j++){ matrix[i][j]/=denominator; } for (k=0; k<4; k++){ if (k != i){ multiplier=matrix[k][i]; for (j=i; j<8; j++) matrix[k][j] -= multiplier*matrix[i][j]; } } }