33.cpp
上传用户:jinqiu1010
上传日期:2021-09-06
资源大小:3082k
文件大小:3k
开发平台:

C/C++

  1. // 33.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <stdio.h>
  7. double *inv(double *a,int n)
  8. int *is,*js,i,j,k,l,u,v;
  9.     double d,p;
  10.     is=(int*)malloc(n*sizeof(int));
  11.     js=(int*)malloc(n*sizeof(int));
  12.     for (k=0; k<=n-1; k++)
  13.       { d=0.0;
  14.         for (i=k; i<=n-1; i++)
  15.         for (j=k; j<=n-1; j++)
  16.           { l=i*n+j; p=fabs(a[l]);
  17.             if (p>d) { d=p; is[k]=i; js[k]=j;}
  18.           }
  19.         if (d+1.0==1.0)
  20.           { free(is); free(js); printf("err**not invn");
  21.             return NULL;
  22.           }
  23.         if (is[k]!=k)
  24.           for (j=0; j<=n-1; j++)
  25.             { u=k*n+j; v=is[k]*n+j;
  26.               p=a[u]; a[u]=a[v]; a[v]=p;
  27.             }
  28.         if (js[k]!=k)
  29.           for (i=0; i<=n-1; i++)
  30.             { u=i*n+k; v=i*n+js[k];
  31.               p=a[u]; a[u]=a[v]; a[v]=p;
  32.             }
  33.         l=k*n+k;
  34.         a[l]=1.0/a[l];
  35.         for (j=0; j<=n-1; j++)
  36.           if (j!=k)
  37.             { u=k*n+j; a[u]=a[u]*a[l];}
  38.         for (i=0; i<=n-1; i++)
  39.           if (i!=k)
  40.             for (j=0; j<=n-1; j++)
  41.               if (j!=k)
  42.                 { u=i*n+j;
  43.                   a[u]=a[u]-a[i*n+k]*a[k*n+j];
  44.                 }
  45.         for (i=0; i<=n-1; i++)
  46.           if (i!=k)
  47.             { u=i*n+k; a[u]=-a[u]*a[l];}
  48.       }
  49.     for (k=n-1; k>=0; k--)
  50.       { if (js[k]!=k)
  51.           for (j=0; j<=n-1; j++)
  52.             { u=k*n+j; v=js[k]*n+j;
  53.               p=a[u]; a[u]=a[v]; a[v]=p;
  54.             }
  55.         if (is[k]!=k)
  56.           for (i=0; i<=n-1; i++)
  57.             { u=i*n+k; v=i*n+is[k];
  58.               p=a[u]; a[u]=a[v]; a[v]=p;
  59.             }
  60.       }
  61.     free(is); free(js);
  62.     return a;
  63. }
  64. void display(double M[],int n) /*显示结果*/
  65. int i,j;
  66. double *result=NULL,*A=NULL;
  67. /*显示原矩阵*/
  68. printf("nnThe OriginalMatrix is:n");
  69.      for(i=0;i<n;i++)
  70. {
  71.    for(j=0;j<n;j++)
  72.    {   
  73.     printf("%10.4ft", M[i*n+j]);
  74.     
  75.    }
  76.       printf("n");
  77. }
  78.      
  79. A=(double*)malloc(n*n*sizeof(double));
  80. for(i=0;i<n*n;i++) A[i]=M[i];
  81. result=inv(A,n);
  82. if(result!=NULL)
  83. {
  84.    printf("nnThe InverseMatrix is:n");
  85.    for(i=0;i<n;i++)
  86.    {
  87.    for(j=0;j<n;j++)
  88.    {   
  89.     printf("%10.4ft", result[i*n+j]);
  90.     
  91.    }
  92.       printf("n");
  93.    }
  94. }
  95. else
  96. {
  97.    printf("The Matrix is singular ! Can't be inverse!n");
  98. }
  99. free(A);
  100. }
  101. #include <conio.h>
  102. /* Test */
  103. int main(int argc, char* argv[])
  104. {
  105. printf("Hello World!n");
  106. double matrix[3][3]={{1,-5,-2},{-1,3,1},{3,-4,-1}};
  107. display(matrix[0],3);
  108. return 0;
  109. }