Guest User

InverseMatrix

a guest
Apr 22nd, 2021
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.06 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4.  
  5. #define EPS 1.0e-12
  6.  
  7. void inverse(double **A,unsigned int n, unsigned int *error)
  8. {
  9.     unsigned int i,j,l,k;
  10.     double   maxA,d,e;
  11.     unsigned int *M;
  12.     M=(unsigned int*)malloc(n*sizeof(unsigned int));
  13.     (*error)=0;
  14.     for(i=1; i<=n; i++)
  15.     {
  16.         // Czesciowy wybor elementu glownego wg wzoru (1.49)
  17.         maxA=0.0;
  18.         for(j=i; j<=n; j++)
  19.         {
  20.             d=A[j - 1][i - 1];
  21.             if(fabs(maxA)<fabs(d))
  22.             {
  23.                 maxA=d;
  24.                 k=j;
  25.             }
  26.         }
  27.         if(fabs(maxA) < EPS)
  28.         {
  29.             (*error)=1;
  30.             free(M);
  31.             return;
  32.         }
  33.         /* Zapisywanie wskaznikow wierszy wystepowania elementu
  34.           ekstremalnego w i-tej iteracji w postaci wektora M[i] */
  35.         M[i - 1]=k;
  36.         A[k - 1][i - 1]=1.0;
  37.         for(j=1; j<=n; j++)
  38.         {
  39.             // Przestawienie i-tego wiersza z k-tym
  40.             d=(double)(A[k - 1][j - 1]/maxA);
  41.             A[k - 1][j - 1]=A[i - 1][j - 1];
  42.             A[i - 1][j - 1]=d;
  43.         }
  44.         // Generacja ciagu macierzy (1.42) wg wzoru rekurencyjnego (1.41)
  45.         for(j=1; j<=n; j++)
  46.             if(j!=i)
  47.             {
  48.                 d=A[j - 1][i - 1];
  49.                 A[j - 1][i - 1]=0.0;
  50.                 for(l=1; l<=n; l++)
  51.                 {
  52.                     e=d*A[i - 1][l - 1];
  53.                     A[j - 1][l - 1]-=e;
  54.                 }
  55.             }
  56.     }
  57.     // Przestawianie kolumn macierzy zgodnie z wektorem wskaznikow M[i] (1.46)
  58.     for(i=n; i>=1; i--)
  59.     {
  60.         k=M[i - 1];
  61.         if(k!=i)
  62.             for(j=1; j<=n; j++)
  63.             {
  64.                 d=A[j - 1][i - 1];
  65.                 A[j - 1][i - 1]=A[j - 1][k - 1];
  66.                 A[j - 1][k - 1]=d;
  67.             }
  68.     }
  69.     free(M);
  70. }
  71.  
  72.  
  73.  
  74.  
  75.  
  76. int main(int argc, char **argv)
  77. {
  78.     FILE *in;
  79.     FILE *out;
  80.     unsigned int i,j,n;
  81.     unsigned int  error;
  82.     double **A;
  83.  
  84.     if ((in = fopen(argv[1], "rt"))
  85.             == NULL)
  86.     {
  87.         fprintf(stderr, "Cannot open input file.\n");
  88.         return 1;
  89.     }
  90.  
  91.     if ((out = fopen(argv[2], "wt"))
  92.             == NULL)
  93.     {
  94.         fprintf(stderr, "Cannot open output file.\n");
  95.         return 1;
  96.     }
  97.  
  98.     while(!feof(in))
  99.     {
  100.         fscanf(in,"%u",&n);
  101.         A=(double**)malloc(n*sizeof(double*));
  102.         for(i=0; i<n; i++)
  103.             A[i]=(double*)malloc(n*sizeof(double));
  104.         for(i=1; i<=n; i++)
  105.             for(j=1; j<=n; j++)
  106.                 fscanf(in,"%lf",&A[i - 1][j - 1]);
  107.         inverse(A,n,&error);
  108.         if(error==0)
  109.         {
  110.             for(i=1; i<=n; i++)
  111.             {
  112.                 for(j=1; j<=n; j++)
  113.                     fprintf(out,"%.12lf ",A[i - 1][j - 1]);
  114.                 fprintf(out,"\n");
  115.             }
  116.         }
  117.         else
  118.             fprintf(out,"Macierz osobliwa \n");
  119.         fprintf(out,"\n");
  120.         for(i=0; i<n; i++)
  121.             free(A[i]);
  122.         free(A);
  123.     }
  124.     fclose(in);
  125.     fclose(out);
  126.     return 0;
  127. }
  128.  
Advertisement
Add Comment
Please, Sign In to add comment