【线性代数 | C++】行列式按行(列)展开

一、定义(余子式、代数余子式)

  • n n n阶行列式中,把 ( i , j ) (i,j) (i,j) a i j a_{ij} aij所在的第 i i i行和第 j j j列划去后,留下来的 n − 1 n-1 n1阶行列式叫做 ( i , j ) (i,j) (i,j) a i j a_{ij} aij余子式,记作 M i j M_{ij} Mij.
  • A i j = ( − 1 ) i + j M i j , A_{ij}=(-1)^{i+j}M_{ij}, Aij=(1)i+jMij A i j A_{ij} Aij叫做 ( i , j ) (i,j) (i,j)元的代数余子式.
  • 例如四阶行列式 D = ∣ a 11 a 12 a 13 a 14 a 21 a 22 a 23 a 24 a 31 a 32 a 33 a 34 a 41 a 42 a 43 a 44 ∣ D=\begin{vmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \\a_{41} & a_{42} & a_{43} & a_{44} \end{vmatrix} D=a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44 ( 3 , 2 ) (3,2) (3,2)元的 a 32 a_{32} a32的余子式和代数余子式分别为 M 32 = ∣ a 11 a 13 a 14 a 21 a 23 a 24 a 41 a 43 a 44 ∣ , M_{32}=\begin{vmatrix} a_{11} & a_{13} & a_{14} \\ a_{21} & a_{23} & a_{24} \\ a_{41} & a_{43} & a_{44}\end{vmatrix}, M32=a11a21a41a13a23a43a14a24a44 A 32 = ( − 1 ) 3 + 2 M 32 = − M 32 . A_{32}=(-1)^{3+2}M_{32}=-M_{32}. A32=(1)3+2M32=M32.

二、引理

  • 一个 n n n阶行列式,如果其中第 i i i行所有元素除 ( i , j ) (i,j) (i,j) a i j a_{ij} aij外都为零,那么这行列式等于 a i j a_{ij} aij与它的代数余子式的乘积,即 D = a i j A i j D=a_{ij}A_{ij} D=aijAij.

三、定理3(行列式按行(列)展开法则)

  • 行列式等于它的任一行(列)的各元素与其对应的代数余子式乘积之和,即 D = a i 1 A i 1 + a i 2 A i 2 + ⋯ + a i n A i n ( i = 1 , 2 , ⋯   , n ) , D=a_{i1}A_{i1}+a_{i2}A_{i2}+\cdots+a_{in}A_{in}(i=1,2,\cdots ,n), D=ai1Ai1+ai2Ai2++ainAin(i=1,2,,n) D = a 1 j A 1 j + a 2 j A 2 j + ⋯ + a n j A n j ( j = 1 , 2 , ⋯   , n ) . D=a_{1j}A_{1j}+a_{2j}A_{2j}+\cdots+a_{nj}A_{nj}(j=1,2,\cdots ,n). D=a1jA1j+a2jA2j++anjAnj(j=1,2,,n).

四、推论

  • 行列式某一行(列)的元素与另一行(列)的对应元素的代数余子式乘积之和等于零.即 a i 1 A j 1 + a i 2 A j 2 + ⋯ + a i n A j n = 0 , i ≠ j , a_{i1}A_{j1}+a_{i2}A_{j2}+\cdots+a_{in}A_{jn}=0,i\neq j, ai1Aj1+ai2Aj2++ainAjn=0,i=j, a 1 i A 1 j + a 2 i A 2 j + ⋯ + a n i A n j = 0 , i ≠ j a_{1i}A_{1j}+a_{2i}A_{2j}+\cdots +a_{ni}A_{nj}=0,i\neq j a1iA1j+a2iA2j++aniAnj=0,i=j.

五、定理3的C++代码

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

//根据定理3求行列式值的函数
int GetDetValue(const vector<vector<int>> &vvDet)
{
    int iDetVal = 0;
    
    //当行列式内没有元素时,返回0
    if(0 == vvDet.size())
    {
        return 0;
    }
    //行列式仅有1个元素时,返回该元素的值
    if(1 == vvDet.size() && 1 == vvDet[0].size())
    {
        return vvDet[0][0];
    }
    else//行列式元素多于1个时,将行列式按第1行展开
    {
        for(unsigned int i = 0; i < vvDet[0].size(); i++)
        {
            //求余子式
            vector<vector<int>> vvCofactor(vvDet);
            vvCofactor.erase(vvCofactor.cbegin());//删除(0,i)元素所在行,即第1行
            for(unsigned int j = 0; j < vvCofactor.size(); j++) //删除(0,i)元素所在列
            {
                vvCofactor[j].erase(vvCofactor[j].cbegin() + i);
            }
            
            //将第1行元素与其代数余子式的乘积进行累加,即为行列式的值
            //行列式的阶数大于1时,进行递归
            iDetVal += (vvDet[0][i] * pow(-1, i) * GetDetValue(vvCofactor));
        }
    }
    return iDetVal;
}

//主函数
int main() 
{
    vector<vector<int>> vvDet{
                               {3,1,-1,2},
                               {-5,1,3,-4},
                               {2,0,1,-1},
                               {1,-5,3,-3}
                              };
    cout << "行列式的值 = " << GetDetValue(vvDet) << endl;
    return 0;
}

—-
引用文献:《工程数学 线性代数(第五版)》同济大学数学系编,高等教育出版社

  • 30
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测绘工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值