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}
a11a21⋮an1a12a22⋮an2⋯⋯⋯a1na2n⋮ann
作出表中位于不同行不同列的
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)ta1p1a2p2⋯anpn(1)
的项,其中
p
1
p
2
⋯
p
n
p_1p_2\cdots p_n
p1p2⋯pn为自然数
1
,
2
,
⋯
,
n
1,2,\cdots ,n
1,2,⋯,n的一个排列,
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)ta1p1a2p2⋯anpn
称为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=
a11a21⋮an1a12a22⋮an2⋯⋯⋯a1na2n⋮ann
简记作
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;
}
引用文献:同济大学数学系编. 工程数学 线性代数 第五版. 北京: 高等教育出版社