矩阵行列式的计算及逆矩阵转换

1.行列式的计算

矩阵行列式的计算在数学上有多种方法,为了编程方便,我采取将矩阵转化为上三角的形式,然后对角线上的数相乘,便得到行列式的值。

首先将矩阵储存在vector的二维数组中,接着开始进行行与行之间的·换算。使矩阵转换为上三角形式。

以下是代码:

void CJZCalculate3Dlg::det()
{

vector<vector<double > > v5=v1;        //  v1是与edit框绑定的变量所表示的矩阵
    vector<vector<double > > v6(100);
    for(int tt=0;tt<r1;tt++)
        v6[tt].resize(c1);
    double c[1000]={0};
    double det=1;
    
    for(int i=0;i<c1-1;i++)    /   上三角运算
    {
        if(v5[i][i]==0)       /// 判断 对角数是否为 0
        {    
            int flag=0;
            for(int f=i+1;f<c1;f++)
            {
                if(v5[f][i]!=0)
                {
                    v6[0]=v5[i];
                    v5[i]=v5[f];
                    v5[f]=v6[0];
                    flag=1;
                    det=0-det;
                    break;
                }
            }
            if(flag==0)
            {
                det=0;
                 break;
            }  
        }     ///   结束判断

        c[i]=v5[i][i];
        for(int j=i+1;j<c1;j++)
            v5[i][j]=v5[i][j]/v5[i][i];
        v5[i][i]=1;
        for(int k=i+1;k<c1;k++)
        {
            for(int t=i+1;t<c1;t++)
             v5[k][t]=v5[k][t]-v5[k][i]*v5[i][t];
            v5[k][i]=0;
        }
    }
    det=det*v5[c1-1][c1-1];
    for(int s=0;s<c1-1;s++)
        det=det*c[s];

m_str3.Format(_T("%lf "),det);     ///m_str3为与edit框绑定的变量,update后便可以将行列式的值刷新到edit框

}
      det的值便为行列式的值

2.逆矩阵的求导

首先,确定待求矩阵行列式是否为0,如果为0.则不存在逆矩阵 

确定了存在逆矩阵后,便可以开始进行计算了;

利用数学公式:矩阵A的矩阵逆矩阵对于,A的伴随矩阵除以A的行列式。

以下为代码:

void CJZCalculate3Dlg::OnButton6() 
{
    // TODO: Add your control notification handler code here

                       ///       m_str3为与edit框绑定的变量

    m_str3="";  //情况edit3里的数据,以便显示新数据

      det();    //  计算行列式
      double A=atof(m_str3);       /   行列式赋值给A
      if(A==0)
      {
          m_str3="行列式为0,不存在逆矩阵";
      }
      else
      {
          double a[100][100]={0};

        v7=v1;
        c1--;
        for(int i=1;i<=r1;i++)             //伴随矩阵计算
        {
          for(int j=1;j<=r1;j++)
          {
            v1.erase(v1.begin()+i-1);
            for(int k=0;k<r1-1;k++)
                v1[k].erase(v1[k].begin()+j-1);
            for(int k2=0;k2<r1-1;k2++)
                v1[k2].resize(r1-1);

            det();
            a[j][i]=atof(m_str3);
            
            if((i+j)%2==1)
                a[j][i]=0-a[j][i];

            for(int jk=0;jk<r1;jk++)
                v1[jk].resize(r1);
            v1=v7;
          }
        }              将伴随矩阵代入数组

        c1++;
        m_str3="";
       for(int t1=1;t1<=r1;t1++)     /// 显示逆矩阵
       { 
         for(int t2=1;t2<=r1;t2++)
         {
           str3.Format(_T("%lf "),a[t1][t2]/A);
           m_str3=m_str3+str3;
         }
         m_str3=m_str3+"\r\n";
       }
      }
                                       CString类型的m_str3就是逆矩阵
    UpdateData(false);      //逆矩阵被刷新到edit框上
}

 

矩阵计算器完整代码见https://download.csdn.net/download/cyl00cyl/10693382,能够实现矩阵加减乘运算,幂运算,数乘运算,转置,行列式,逆矩阵。 能够检测矩阵是否完整,能够识别是否能进行所选择的运算,并且提示出不能进行计算的原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值