逆矩阵

int brinv(a,n)

  int n;

  double *a;

  { int *is,*js,i,j,k,l,u,v;

    double d,p;

    is=malloc(n*sizeof(int));

    js=malloc(n*sizeof(int));

    for (k=0; k<=n-1; k++)

      { d=0.0;

        for (i=k; i<=n-1; i++)

        for (j=k; j<=n-1; j++)

          { l=i*n+j; p=fabs(a[l]);

            if (p>d) { d=p; is[k]=i; js[k]=j;}

          }

        if (d+1.0==1.0)

          { free(is); free(js); printf("err**not inv\n");

            return(0);

          }

        if (is[k]!=k)

          for (j=0; j<=n-1; j++)

            { u=k*n+j; v=is[k]*n+j;

              p=a[u]; a[u]=a[v]; a[v]=p;

            }

        if (js[k]!=k)

          for (i=0; i<=n-1; i++)

            { u=i*n+k; v=i*n+js[k];

              p=a[u]; a[u]=a[v]; a[v]=p;

            }

        l=k*n+k;

        a[l]=1.0/a[l];

        for (j=0; j<=n-1; j++)

          if (j!=k)

            { u=k*n+j; a[u]=a[u]*a[l];}

        for (i=0; i<=n-1; i++)

          if (i!=k)

            for (j=0; j<=n-1; j++)

              if (j!=k)

                { u=i*n+j;

                  a[u]=a[u]-a[i*n+k]*a[k*n+j];

                }

        for (i=0; i<=n-1; i++)

          if (i!=k)

            { u=i*n+k; a[u]=-a[u]*a[l];}

      }

    for (k=n-1; k>=0; k--)

      { if (js[k]!=k)

          for (j=0; j<=n-1; j++)

            { u=k*n+j; v=js[k]*n+j;

              p=a[u]; a[u]=a[v]; a[v]=p;

            }

        if (is[k]!=k)

          for (i=0; i<=n-1; i++)

            { u=i*n+k; v=i*n+is[k];

              p=a[u]; a[u]=a[v]; a[v]=p;

            }

      }

    

    free(is); free(js);

    return(1);

  }

转载于:https://my.oschina.net/qihaitao/blog/531019

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值