线性代数|行列式定义及其值

1 n阶行列式定义

设有 n 2 n^2 n2个数,排成 n n n n n n列的数表
a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n \begin{matrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{matrix} a11a21an1a12a22an2a1na2nann
作出表中位于不同行不同列的 n n n个数的乘积,并冠以符号 ( − 1 ) t (-1)^t (1)t,得到形如
( − 1 ) t a 1 p 1 a 2 p 2 ⋯ a n p n (1) (-1)^ta_{1p_1}a_{2p_2}\cdots a_{np_n} \tag{1} (1)ta1p1a2p2anpn(1)
的项,其中 p 1 p 2 ⋯ p n p_1p_2\cdots p_n p1p2pn为自然数 1 , 2 , ⋯ , n 1,2,\cdots ,n 12n的一个排列, t t t为这个排列的逆序数
由于这样的排列共有 n ! n! n!个,因而形如 ( 1 ) (1) (1)的项共有 n ! n! n!项。所有这 n ! n! n!项的代数和
∑ ( − 1 ) t a 1 p 1 a 2 p 2 ⋯ a n p n \sum (-1)^ta_{1p_1}a_{2p_2}\cdots a_{np_n} (1)ta1p1a2p2anpn
称为n阶行列式,记作
D = ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ∣ D= \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix} D= a11a21an1a12a22an2a1na2nann
简记作 d e t ( a i j ) det(a_{ij}) det(aij),其中数 a i j a_{ij} aij为行列式 D D D ( i , j ) (i,j) (i,j)元。

2 根据定义求行列式的值(C++实现)

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

using namespace std;

//求逆序数
int FindInverseNum(vector<int> v_iPermInput)
{
    int iInverseNum = 0;
    for (unsigned int i = 0; i < v_iPermInput.size(); i++)
    {
        for (unsigned int j = 0; j < i; j++)
        {
            if (v_iPermInput[j] > v_iPermInput[i])
            {
                iInverseNum++;
            }            
        }        
    }
    return iInverseNum;
}

//求全排列
vector<vector<int>> vv_iPerm;
vector<int> v_iPerm;  
bool GetPerm(vector<int> v_iPermInput0)
{
    if (0 == v_iPermInput0.size())
    {
        return false;
    }    
    
    if (1 == v_iPermInput0.size())
    {
        v_iPerm.push_back(v_iPermInput0[0]);
        vv_iPerm.push_back(v_iPerm);
        v_iPerm.pop_back();
        return true;
    }
    else
    {
        for (unsigned int i = 0; i < v_iPermInput0.size(); i++)
        {
            v_iPerm.push_back(v_iPermInput0[i]);
            vector<int> v_iPermInput1(v_iPermInput0);
            v_iPermInput1.erase(v_iPermInput1.cbegin() + i);
            GetPerm(v_iPermInput1);
            v_iPerm.pop_back();
        }        
    }
    return true;
}


int main()
{
    vector<vector<int>> vv_i{
                                {1,2,-4},
                                {-2,2,1},
                                {-3,4,-2}
                            }; //假定一个3阶行列式
   
    int iRows = vv_i.size(); //行列式的行数

    int iCol = 0; //行列式的列数变量

    //列标组成向量
    vector<int> v_iCol;
    for (unsigned int i = 0; i < iCol; i++)
    {
        v_iCol.push_back(i);
    }

    //获取列标的全排列
    GetPerm(v_iCol);

    //声明行列式值变量
    int iDetVal = 0;

    //计算行列式的值
    for (unsigned int i = 0; i < vv_iPerm.size(); i++)
    {
        //求逆序数
        int iInverseNum = FindInverseNum(vv_iPerm[i]);

        //计算行列式各项的值
        int iVal = 1;
        for (unsigned int j = 0; j < vv_iPerm[i].size(); j++)
        {
            iVal *= vv_i[j][vv_iPerm[i][j]];
        }
        iDetVal += (pow(-1, iInverseNum) * iVal);             
    }
    
    cout << "行列式的值 = " << iDetVal << endl;
    
    return 0;
}

引用文献:同济大学数学系编. 工程数学 线性代数 第五版. 北京: 高等教育出版社

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

测绘工程师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值