zoukankan      html  css  js  c++  java
  • 矩阵求逆算法及程序实现(C++)

      在做课题时,遇到了求多项式问题,利用了求逆方法。矩阵求逆一般使用简单的算法,还有快速算法 如全选主元高斯-约旦消元法,但本文程序主要写了简单的矩阵求逆算法定义法之伴随矩阵求逆公式如下,其中A可逆:

                    A^{-1}=frac{A^*}{|A|},其中A^*A伴随矩阵。。

      1.给定一个方阵,非奇异(不是也可,程序有考虑);

      2.由矩阵得到其行列式,求其值如|A|;

      3.求其伴随矩阵A^*

      4.得到其逆矩阵。

    主要函数如下:

     1 //得到给定矩阵src的逆矩阵保存到des中。
     2 bool GetMatrixInverse(double src[N][N],int n,double des[N][N])
     3 {
     4     double flag=getA(src,n);
     5     double t[N][N];
     6     if(flag==0)
     7     {
     8         return false;
     9     }
    10     else
    11     {
    12         getAStart(src,n,t);
    13         for(int i=0;i<n;i++)
    14         {
    15             for(int j=0;j<n;j++)
    16             {
    17                 des[i][j]=t[i][j]/flag;
    18             }
    19 
    20         }
    21     }
    22 
    23 
    24     return true;
    25 
    26 }

    计算|A|:

     1 //按第一行展开计算|A|
     2 double getA(double arcs[N][N],int n)
     3 {
     4     if(n==1)
     5     {
     6         return arcs[0][0];
     7     }
     8     double ans = 0;
     9     double temp[N][N]={0.0};
    10     int i,j,k;
    11     for(i=0;i<n;i++)
    12     {
    13         for(j=0;j<n-1;j++)
    14         {
    15             for(k=0;k<n-1;k++)
    16             {
    17                 temp[j][k] = arcs[j+1][(k>=i)?k+1:k];
    18 
    19             }
    20         }
    21         double t = getA(temp,n-1);
    22         if(i%2==0)
    23         {
    24             ans += arcs[0][i]*t;
    25         }
    26         else
    27         {
    28             ans -=  arcs[0][i]*t;
    29         }
    30     }
    31     return ans;
    32 }

    计算伴随矩阵:

     1 //计算每一行每一列的每个元素所对应的余子式,组成A*
     2 void  getAStart(double arcs[N][N],int n,double ans[N][N])
     3 {
     4     if(n==1)
     5     {
     6         ans[0][0] = 1;
     7         return;
     8     }
     9     int i,j,k,t;
    10     double temp[N][N];
    11     for(i=0;i<n;i++)
    12     {
    13         for(j=0;j<n;j++)
    14         {
    15             for(k=0;k<n-1;k++)
    16             {
    17                 for(t=0;t<n-1;t++)
    18                 {
    19                     temp[k][t] = arcs[k>=i?k+1:k][t>=j?t+1:t];
    20                 }
    21             }
    22 
    23 
    24             ans[j][i]  =  getA(temp,n-1);
    25             if((i+j)%2 == 1)
    26             {
    27                 ans[j][i] = - ans[j][i];
    28             }
    29         }
    30     }
    31 }

      这三个函数组成了求逆矩阵的步骤,笔者调用并成功运用,无错,在此共勉。如有问题,请留言。谢谢

      另有其他矩阵求逆好算法及代码请大家共享。

  • 相关阅读:
    关于m3u8格式的视频文件ts转mp4下载和key加密问题
    Flask報錯 KeyError 'SQLALCHEMY_TRACK_MODIFICATIONS'.md
    ajax post data 获取不到数据,注意 content-type的设置 、post/get(转)
    Ajax 的一些概念 解析
    Apache2 服务配置 ubuntu16.04 + django1.11
    GitHub 远程仓库 de 第一次配置
    Django自带后台admin的使用配置
    每次启动虚拟机都要重置网卡设置,否则无法上网,很烦
    pip崩了, 解决 ModuleNotFoundError: No module named 'pip'.
    vue proxyTable
  • 原文地址:https://www.cnblogs.com/zCoderJoy/p/3999118.html
Copyright © 2011-2022 走看看