/* 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];
}
}
}