Search This Blog

Monday 11 February 2013

code to find the inverse of a matrix:

#include<stdio.h>
#include<stdlib.h>

int n;
void copym(float **a,float **b,int p)
{
  int i,j;for (i=0;i<p;i++){for (j=0;j<p;j++){b[i][j]=a[i][j];}}return;
}

float **divm(float **a,float k)
{int i,j;for (i=0;i<n;i++){for (j=0;j<n;j++){a[i][j]=a[i][j]/k;}}return a;}

int powm1(int i)
{if (i%2==0)return 1;else return -1;}

void print_mat(float **a)
{int i,j;for (i=0;i<n;i++){for(j=0;j<n;j++){printf("%f  ",a[i][j]);}printf("\n");}}
    
void swap(float * a,float * b)
{float t;t=*a;*a=*b;*b=t;return;}

 void row_change(float * a,float * b)
  {int i;for (i=0;i<n;i++){swap (&a[i],&b[i]);}return;}

  void row_trans(float * a,float *b,float f)
  {int i;for (i=0;i<n;i++){a[i]=a[i]+f*b[i];}return;}
 

float **extract(float **a,int i,int j)
 {int k,l,m,p; float **b=calloc(n-1,sizeof(float *));for (k=0,m=0;k<n&&m<n-1;k++,m++){if (k==i)k++;}b[m]=calloc(n-1,sizeof(float));for (l=0,p=0;l<n&&p<n-1;l++,p++){if (l==j){l++;}b[m][p]=a[k][l];}}return b;}

float det(float **b,int m)
{
  float **a=calloc(m,sizeof(float *));
  int i,j,k,count=0;for (i=0;i<m;i++){a[i]=calloc(m,sizeof(float));}copym(b,a,m);
  for (i=0;i<m;i++){if (a[i][i]==0){for (j=i;j<m;j++){if (a[j][i] !=0){row_change(a[i],a[j]);count=count+1;break;}}if (a[i][i] == 0){for (j=i;j<m;j++){if(a[i][j] !=0){for (k=0;k<m;k++){ if (k !=i){row_trans(a[k],a[i],-a[k][j]/a[i][j]);}}break;}}}}else{for (j=0;j<m;j++){if (j !=i){row_trans(a[j],a[i],-a[j][i]/a[i][i]);}}}}float pro=1;for (i=0;i<m;i++){pro=pro*a[i][i];}if (count%2==0){return pro;}else return (-1*pro);}

float **cof(float **a)
{int i,j;float **c=calloc(n,sizeof(float *));for (i=0;i<n;i++){*(c+i)=calloc(n,sizeof(float));for (j=0;j<n;j++){c[i][j]=powm1(i+j)*det(extract(a,i,j),n-1);}}return c;}

float **trpose(float **a)
{int i,j;for (i=0;i<n;i++){for(j=0;j<n;j++){if(i>=j){swap(&a[i][j],&a[j][i]);}}}return a;}

main()
{printf("enter the order\n");
  scanf("%d",&n);
  float **a=calloc(n,sizeof(float *));
  int i,j;for (i=0;i<n;i++){a[i]=calloc(n,sizeof(float));for (j=0;j<n;j++){scanf("%f",&a[i][j]);}}
  float d=det(a,n);
  if (d !=0)
  {
     print_mat(divm(trpose(cof(a)),d));
  }
  else
  printf("inverse doesn't exist\n");}
  

paste this code and see what happens.........keep wondering till the next program.

No comments:

Post a Comment