matrixqiuni.txt

来自「矩阵求逆的程序,希望大家可以用到,省去麻烦」· 文本 代码 · 共 99 行

TXT
99
字号
double nie(a,n)
int n;
double a[];
  {int i,j,k,m;
   double w,g,*b;
   b=malloc(n*sizeof(double));
   for(k=0;k<=n-1;k++)
      {w=a[0];
       if(fabs(w)+1.0==1.0)
         {free(b);printf("fail\n");return(-2);
         }
       m=n-k-1;
       for(i=1;i<=n-1;i++)
          {g=a[i*n];b[i]=g/w;
           if(i<=m)b[i]=-b[i];
           for(j=1;j<=i;j++)
              a[(i-1)*n+j-1]=a[i*n+j]+g*b[j];
          }
          a[n*n-1]=1.0/w;
          for(i=1;i<=n-1;i++)
              a[(n-1)*n+i-1]=b[i];
       }
       for(i=0;i<=n-2;i++)
       for(j=i+1;j<=n-1;j++)
           a[i*n+j]=a[j*n+i];
       free(b);
       return(2);
   }

*************************************************
void qiuni(double(*p)[2*n])
   {
    double c;
    for(k=0;k<n-1;k++)
    for(i=k+1;i<n;i++)
       {
        c=(*(*(p+i)+k))/(*(*(p+k)+k));
        for(j=k;j<2*n;j++)
           {
            (*(*(p+i)+j))=(*(*(p+i)+j))-c*(*(*(p+k)+j));
           }
     }
     for(k=n-1;k>=1;k--)
     for(i=k-1;i>=0;i--)
        {c=(*(*(p+i)+k))/(*(*(p+k)+k));
        {for(j=2*n-1;j>=0;j--)
            (*(*(p+i)+j))=(*(*(p+i)+j))-c*(*(*(p+k)+j));
        }
        }
     for(i=0;i<n;i++)
     for(j=0;j<2*n;j++)
        {if(i==j)
           c=*(*(p+i)+j);
           if(j>=i)
             *(*(p+i)+j)=*(*(p+i)+j)/c;
         }
     }   

*************************************************
void inverse(double c[n][n])
{  int i,j,h,k;
   double p;
   double q[n][12];
  for(i=0;i<n;i++)//构造高斯矩阵
     for(j=0;j<n;j++)
     q[i][j]=c[i][j];
  for(i=0;i<n;i++)
     for(j=n;j<12;j++)
	 {if(i+6==j)
     q[i][j]=1;
    else
     q[i][j]=0;}
  for(h=k=0;k<n-1;k++,h++)//消去对角线以下的数据
     for(i=k+1;i<n;i++)
	 {if(q[i][h]==0)
     continue;
   p=q[k][h]/q[i][h];
  for(j=0;j<12;j++)
  { q[i][j]*=p;
    q[i][j]-=q[k][j];
  }
	 }
for(h=k=n-1;k>0;k--,h--) // 消去对角线以上的数据
 for(i=k-1;i>=0;i--)
 {if(q[i][h]==0)
    continue;
  p=q[k][h]/q[i][h];
  for(j=0;j<12;j++)
  {q[i][j]*=p;
  q[i][j]-=q[k][j];}}
for(i=0;i<n;i++)//将对角线上数据化为1
 { p=1.0/q[i][i];
 for(j=0;j<12;j++)
   q[i][j]*=p;}
 for(i=0;i<n;i++) //提取逆矩阵
 for(j=0;j<n;j++)
  c[i][j]=q[i][j+6];
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?