标题：行列式
基本信息
简介行列式在数学中，是由解线性方程组产生的一种算式。[1]其定义域为nxn的矩阵A，取值为一个标量，写作det(A)或 | A | 。行列式可以看做是有向面积或体积的概念在一般的欧几里得空间中的推广。或者说，在 n维欧几里得空间中，行列式描述的是一个线性变换对“体积”所造成的影响。无论是在线性代数、多项式理论，还是在微积分学中（比如说换元积分法中），行列式作为基本的数学工具，都有着重要的应用。 行列式概念最早出现在解线性方程组的过程中。十七世纪晚期，关孝和与莱布尼茨的著作中已经使用行列式来确定线性方程组解的个数以及形式。十八世纪开始，行列式开始作为独立的数学概念被研究。十九世纪以后，行列式理论进一步得到发展和完善。矩阵概念的引入使得更多有关行列式的性质被发现，行列式在许多领域都逐渐显现出重要的意义和作用，出现了线性自同态和向量组的行列式的定义。行列式(16张)特性行列式的特性可以被概括为一个多次交替线性形式，这个本质使得行列式在欧几里德空间中可以成为描述“体积”的函数。　
若干数字组成的一个类似于矩阵的方阵，与矩阵不同的是，矩阵的表示是用中括号，而行列式则用线段。行列式的值是按下述方式可能求得的所有不同的积的代数和，既是一个实数：求每一个积时依次从每一行取一个元因子，而这每一个元因子又需取自不同的列，作为乘数，积的符号是正是负决定于要使各个乘数的列的指标顺序恢复到自然顺序所需的换位次数是偶数还是奇数。也可以这样解释：行列式是矩阵的所有不同行且不同列的元素之积的代数和，和式中每一项的符号由积的各元素的行指标与列指标的逆序数之和决定：若逆序数之和为偶数，则该项为正；若逆序数之和为奇数，则该项为负。逆序数在一个排列中，如果一对数的前后位置与大小顺序相反，即前面的数大于后面的数，那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列；逆序数为奇数的排列称为奇排列。如2431中，21，43，41，31是逆序，逆序数是4，为偶排列。
历史
行列式的概念最初是伴随着方程组的求解而发展起来的。行列式的提出可以追溯到十七世纪，最初的雏形由日本数学家关孝和与德国数学家戈特弗里德·莱布尼茨各自独立得出，时间大致相同。日本数学家关孝和提出来的，他在1683年写了一部名为解伏题之法的著作，意思是“解行列式问题的方法”，书中对行列式的概念和它的展开已经有了清楚的叙述。欧洲第一个提出行列式概念的是德国数学家，微积分学奠基人之一莱布尼茨。早期研究1545年，卡当在著作《大术》（Ars Magna）中给出了一种解两个一次方程组的方法。他把这种方法称为“母法”（regula de modo）。这种方法和后来的克莱姆法则已经很相似了，但卡当并没有给出行列式的概念。
1683年，日本数学家关孝和在其著作《解伏题之法》中首次引进了行列式的概念。书中出现了、乃至的行列式，行列式被用来求解高次方程组。莱布尼茨的研究1693年，德国数学家莱布尼茨开始使用指标数的系统集合来表示有三个未知数的三个一次方程组的系数。他从三个方程的系统中消去了两个未知量后得到一个行列式。这个行列式等于零，就意味着有一组解同时满足三个方程。由于当时没有矩阵的概念，莱布尼茨将行列式中元素的位置用数对来表示：ij代表第i 行第j 列。莱布尼茨对行列式的研究成果中已经包括了行列式的展开和克莱姆法则，但这些结果在当时并不为人所知。垂直线记法矩阵 A 的行列式有时也记作 |A|。绝对值和矩阵范数也使用这个记法，有可能和行列式的记法混淆。不过矩阵范数通常以双垂直线来表示（如：），且可以使用下标。此外，矩阵的绝对值是没有定义的。因此，行列式经常使用垂直线记法（例如：克莱姆法则和子式）。例如，一个矩阵：
  矩阵
行列式 det(A) 也写作 | A | 或明确的写作：
  行列式
即矩阵的方括号以细长的垂直线取代。
定义
一个矩阵A的行列式有一个乍看之下很奇怪的定义：
  行列式其中sgn(σ)是排列σ的符号差。
对于比较小的矩阵，比如说二阶和三阶的矩阵，行列式表达如下，有些像是主对角线（左上至右下）元素的乘积减去副对角线（右上至左下）元素的乘积（见图中红线和蓝线）。
2阶： 3阶：。 但对于阶数较大的矩阵，行列式有 n! 项，并不是这样的形式。
二维向量组的行列式
行列式是向量形成的平行四边形的面积
设P是一个二维的有向欧几里得空间，即一个所谓的欧几里得平面。两个向量X和X’的行列式是：
经计算可知，行列式表示的是向量X和X ’形成的平行四边形的有向面积。并有如下性质：
行列式为零当且仅当两个向量共线（线性相关），这时平行四边形退化成一条直线。 如果以逆时针方向为正向的话，有向面积的意义是：平行四边形面积为正当且仅当向量X和X’逆时针排列（如图）。 行列式是一个双线性映射。三维向量组的行列式设E是一个三维的有向欧几里得空间。三个三维向量的行列式是：
这时的行列式表示X、X’和X’’三个向量形成的平行六面体的有向体积，也叫做这三个向量的混合积。同样的，可以观察到如下性质：
行列式为零当且仅当三个向量共线或者共面（三者线性相关），这时平行六面体退化为平面图形，体积为零。 这时行列式是一个“三线性映射”，也就是说，对第一个向量有 ，对第二、第三个向量也是如此。基底选择在以上的行列式中，我们不加选择地将向量在所谓的正交基下分解，实际上在不同的基底之下，行列式的值并不相同。这并不是说平行六面体的体积不唯一。恰恰相反，基底变换可以看作线性映射对基的作用，而不同基底下的行列式代表了基底变换对“体积”的影响。可以证明，对于所有同定向的标准正交基底，向量组的行列式的值是一样的。也就是说，如果我们选择的基底都是“单位长度”，并且两两正交，那么在这样的基底之下，平行六面体的体积是唯一的。线性变换经线性映射后的正方体
设E是一个一般的n维的有向欧几里得空间。一个线性变换把一个向量线性地变为另一个向量。比如说，在三维空间中，向量(x,y,z)被射到向量(x’,y’,z’)：
其中a、b、c等是系数。如右图，正方体（可以看作原来的一组基形成的）经线性变换后可以变成一个普通的平行六面体，或变成一个平行四边形（没有体积）。这两种情况表示了两种不同的线性变换，行列式可以将其很好地分辨出来（为零或不为零）。
更详细地说，行列式表示的是线性变换前后平行六面体的体积的变化系数。如果设左边的正方体体积是一，那么中间的平行六面体的（有向）体积就是线性变换的行列式的值，右边的平行四边形体积为零，因为线性变换的行列式为零。这里我们混淆了线性变换的行列式和向量组的行列式，但两者是一样的，因为我们在对一组基作变换。严格的定义由二维及三维的例子，我们可以看到一般的行列式应该具有怎样的性质。为了描述一个n维空间中的“平行多面体”的“体积”，行列式首先需要是线性的，这可以由面积的性质得到。这里的线性是对于每一个向量来说的，因为当一个向量变为原来的a倍时，“平行多面体”的“体积”也变为原来的a倍。其次，当一个向量在其它向量组成的“超平面”上时，“平行多面体”的“体积”是零（可以想象三维空间的例子）。也就是说，当向量线性相关时，行列式为零。于是可以得出行列式的定义：向量组的行列式行列式是E到K上的交替多线性形式。
具体来说，设 E 是一个内积空间，一个从E到K上的交替多线性形式是指函数：
（多线性） 或者说，当ai = aj 的时候 （交替性） 所有E到K上的交替多线性形式的集合记作 An(E) 。
定理： An(E) 的维度是1，也就是说，设是 E 的一组基，那么，所有的交替多线性形式都可以写成 
其中是在基B下的展开。 定理的证明是对任一个多线性形式，考虑将D依照多线性性质展开，
这时，由交替性，当且仅当 是的一个排列，所以有
这里， 。
向量组的行列式设是 E 的一组基，基B的行列式就是唯一的（由定理可知）交替多线性形式 使得：
detB(e1,...,en) = 1 于是向量组 的行列式就是 
其中是在基B下的展开。 这个公式有时被称作莱布尼兹公式。
基变更公式设B与B’是向量空间中的两组基，则将上式中的detB改为detB’就得到向量组在两组基下的行列式之间的关系：矩阵的行列式设Mn(K)为所有定义在K上的矩阵的集合。将矩阵 A 的元素为A=(aij)。将矩阵 M 的 n 行写成，aj 可以看作是上的向量。于是可以定义矩阵A的行列式为向量组的行列式，这里的向量都在的正交基上展开，因此矩阵的行列式不依赖于基的选择。
这样定义的矩阵 A 的行列式与向量组的行列式有同样的性质。单位矩阵的行列式为1，若矩阵的两行线性相关，则行列式为零。
由莱布尼兹公式，可以证明矩阵行列式的一个重要性质：一个矩阵的行列式等于它的转置矩阵的行列式。
也就是说矩阵的行列式既可以看作 n 个行向量的行列式，也可以看作 n 个列向量的行列式。
证明：矩阵 A 的转置矩阵的行列式是：
令j = σ(i)，由于每个排列都是双射，所以上式变成：
令τ = σ ，当 σ 取遍所有排列时，τ 也取遍所有排列，而且 σ 的符号差等于 τ 的符号差。所以
线性映射的行列式设 f 是 n 维线性空间E 到自身的线性变换（线性自同态），f 在 E 的任意一组基下的变换矩阵的行列式都是相等的。设 B 是 E 的一组基。那么 f 的行列式就是 f 在 B 下的变换矩阵的行列式：
之前对正方体做变换时， x1, ..., xn 是原来的基，，因此可以混淆向量组的行列式和线性变换的行列式。
考虑映射df,B使得 x1, ..., xn 被映射到
df,B 是一个交替n线性形式，因此由前面证的定理， df,B 和 detB 只相差一个系数。
令 x1, ..., xn 等于 B ，则得到
λ = df,B(B) 所以有
也就是说
对于另外一组基B' ，运用基变更公式，可以得到 du, B(B) 等于 du, B ' (B ' ) 。于是 df,B(B) 是一个不依赖于基，只依赖于 f 的数。这正是 detf 的定义。
特别地，行列式为 1 的线性变换保持向量组的行列式，它们构成一般线性群GL(E) 的一个子群 SL(E) ，称作特殊线性群。可以证明， SL(E) 是由所有的错切生成的，即所有具有如下形式的矩阵代表的线性变换：
也就是说，错切变换保持向量组形成的“平行多面体”的体积。同样，可以证明两个相似矩阵有相等的行列式。
应用
求特征值：给定一个n阶矩阵A，n阶非零列向量x，令Ax=λx，则称λ为A的特征值，x为A的特征向量。通过变形得行列式[A-λE]=0值时，上式成立，而此行列式为零，即Σf（λ)=0即解一元n次方程，求出特征值。
多变元微积分的代换积分法（参见雅可比矩阵） 在n个n维实向量所组成的平行多面体的体积，是这些实向量的所组成的矩阵的行列式的绝对值。以此推广，若线性变换可用矩阵A表示，S是R的可测集，则f(S)的体积是S的体积的倍。 朗斯基行列式行列式的基本性质概述
在行列式中，一行（列）元素全为0，则此行列式的值为0。 
在行列式中，某一行（列）有公因子k，则可以提出k。 
在行列式中，某一行（列）的每个元素是两数之和，则此行列式可拆分为两个相加的行列式。
行列式中的两行（列）互换，改变行列式正负符号。 
在行列式中，有两行（列）对应成比例或相同，则此行列式的值为0。 
将一行（列）的k倍加进另一行（列）里，行列式的值不变。 注意：一行（列）的k倍加上另一行（列），行列式的值改变。 
将行列式的行列互换，行列式的值不变。其中，行列互换相当于转置，记作D = D。 例如
其它性质
若A是可逆矩阵， 设A‘ 为A的转置矩阵， （参见共轭） 若矩阵相似，其行列式相同。 行列式是所有特征值之积。这可由矩阵必和其Jordan标准形相似推导出。行列式的展开余因式(英译：cofactor)
又称“余子式”、“余因子”。参见主条目 余因式 对一个 n 阶的行列式M，去掉M的第i行第j列后形成的 n-1 阶的行列式叫做M关于元素mij的子式。记作Mij。
余因式为 Cij=（-1）^(i+j)*Mij代数余子式M关于元素mij的代数余子式记作Cij。。行和列的展开一个 n 阶的行列式M可以写成一行(或一列)的元素与对应的代数余子式的乘积之和，叫作行列式按一行(或一列)的展开。
这个公式又称作拉普拉斯公式，把 n 阶的行列式计算变为了 n 个 n-1 阶行列式的计算。行列式函数由拉普拉斯公式可以看出，矩阵A的行列式是关于其系数的多项式。因此行列式函数具有良好的光滑性质。
单变量的行列式函数设为的函数，则也是的。其对t的导数为
矩阵的行列式函数函数是连续的。由此，n阶一般线性群是一个开集，而特殊线性群则是一个闭集。
函数也是可微的，甚至是光滑的（）。其在A处的展开为
也就是说，在装备正则范数的矩阵空间Mn()中，伴随矩阵是行列式函数的梯度
特别当A为单位矩阵时，
可逆矩阵的可微性说明一般线性群GLn()是一个李群。行列式与线性方程组行列式的一个主要应用是解线性方程组。当线性方程组的方程个数与未知数个数相等时，方程组不一定总是有唯一解。对一个有 n 个方程和 n 个未知数的线性方程组，我们研究未知数系数所对应的行列式。这个线性方程组有唯一解当且仅当它对应的行列式不为零。这也是行列式概念出现的根源。
当线性方程组对应的行列式不为零时，由克莱姆法则，可以直接以行列式的形式写出方程组的解。但用克莱姆法则求解计算量巨大，因此并没有实际应用价值，一般用于理论上的推导。
行列式在数学中，是一个函数，其定义域为的矩阵A，取值为一个标量，写作det(A)或 | A | 。行列式可以看做是有向面积或体积的概念在一般的欧几里得空间中的推广。或者说，在 n 维欧几里得空间中，行列式描述的是一个线性变换对“体积”所造成的影响。无论是在线性代数、多项式理论，还是在微积分学中（比如说换元积分法中），行列式作为基本的数学工具，都有着重要的应用。高阶行列式的计算本程序内容
]窗体代码如下b]
Option Explicit
Option Base 1
Private Sub Form_Load()
Dim i As Long
n = Val(InputBox("请输入行列式的阶数！", "输入框"))
If n < 2 Then
MsgBox "输入错误阶数必须大于1！" & vbCrLf & "请单击重试重新输入！", vbCritical, "系统提示"
Exit Sub
Command2.TabIndex = 1
End If
If n > 9 Then
MsgBox "输入错误本程序只能计算10阶以下的行列式！" & "请单击重试重新输入！", vbCritical, "系统提示"
Exit Sub
Command2.TabIndex = 1
End If
str2 = "1"
For i = 2 To n
str2 = str2 & i '组成1到n组成的字符串123456.....n
Next i
s = n
MsgBox "请在文本框里按行排列输入行列式" & vbCrLf & "注意用一个空格隔开！", vbOKOnly, "信息提示"
Text1.TabIndex = 1
Text1.Text = ""
End Sub
Private Sub Command1_Click()
Dim i As Long, j As Long, k As Long, m As Long, sum As Long, w As Long
Dim strb As String, sz1() As String, sz2() As Long, sz3() As Long
Dim str1 As String, str3 As String, st() As String
ReDim sa(n) As Long, sz2(n) As Long
'//st() 为输入行列式的字符串数组
'//sz3()为二维行列式数组
'//str2为1到n组成的字符串123456.....n 为全局变量
'//str3为str2的全排列所组成的字符串每种排列以“，”隔开
str1 = Text1.Text
If Len(str1) < 2 * n ^ 2 - 1 Then
MsgBox "输入错误！" & vbCrLf & n & "阶行列式中元素个数应为" & n ^ 2 & "！" & vbCrLf & "请查看是否个元素之间都用空格隔开及个数是否正确！" & vbCrLf & "请点击重试重新输入！", vbCritical, "系统提示"
Text1.Text = ""
Exit Sub
End If
st() = Split(str1) '取得行列式的数据
ReDim sz3(n, s) As Long
For i = 1 To n
For j = 1 To s
k = (i - 1) * s + j '按行排列行列式中第k个数，k与i,j的关系
sz3(i, j) = Val(st(k - 1)) '把原数组按行排列存入一个二维数组
Next j
Next i
Permutation "", str2, str3
sz1() = Split(str3, ",") '取n!个全排列存入 数组 sz1()
For j = 1 To JC(n)
m = 1 '每次都降m初始为1
strb = sz1(j) '每次取出一种排列存入strb
For i = 1 To n
sz2(i) = Val(Mid(strb, i, 1)) '顺序取每个全排列中的数字存入数组sz2()
Next i
For i = 1 To n
m = m * sz3(sz2(i), i) '求元素之积
Next i
sum = sum + arr(sz2(), n) * m 'n！个积相加并相应冠上正负号
Next j
Text2.Text = sum
End Sub
Private Sub Command2_Click()
Dim i As Long
n = Val(InputBox("请输入行列式的阶数！", "输入框"))
If n < 2 Then
MsgB  行列式ox "输入错误阶数必须大于1！" & vbCrLf & "请单击重试重新输入！", vbCritical, "系统提示"
Exit Sub
Command2.TabIndex = 1
End If
If n > 9 Then
MsgBox "输入错误本程序只能计算10阶一下的行列式！" & "请单击重试重新输入！", vbCritical, "系统提示"
Exit  行列式Sub
Command2.TabIndex = 1
End If
str2 = "1"
For i = 2 To n
str2 = str2 & i '组成1到n组成的字符串123456.....n
Next i
s = n
MsgBox "请在文本框里按行排列输入行列式" & vbCrLf & "注意用一个空格隔开！", vbOKOnly, "信息提示"
Text1.Text = ""
End Sub
模块1
递  行列式归法求全排列
Option Explicit
Option Base 1
'递归求全排列并返回全排列所组成的字符串
'算法描述:
'以8位为例，求8位数的全排列，其实是8位中任取一位
'在后加上其余7位的全排列
'7 位：任取一位，其后跟剩下6位的全排列
'……
'这样就有两部分，一部分为前面的已经取出来的串，另一部分为后面即将进行的全排列的串
'参数pre即为前面已经取出来的串
'参数s  行列式即为将要进行排列的串
'参数str即为返回全排列所组成的字符串，每种排列以“，”隔开
Public Sub Permutation(pre As String, s As String, str As String)
Dim i As Long
'// 如果要排列的串长度为1，则返回
If Len(s) = 1 Then
'//将排列数以“，”隔开存入一个字符串
str = str & "," & pre & s
Exit  行列式Sub
End If
'// for循环即是取出待排列的串的任一位
For i = 1 To Len(s)
'// 递归，将取出的字符并入已经取出的串
'// 那么剩下的串即为待排列的串
Permutation pre & Mid$(s, i, 1), Left$(s, i - 1) & Mid$(s, i + 1), str
Next i
End Sub
模块2
求逆序数
Option Explicit
Opt  行列式ion Base 1
Public n As Long, s As Long, str2 As String
'//求存入a()数组排列为奇排列还偶排列如果为奇排列返回-1，偶排列返回1
Public Function arr(a() As Long, ByVal n As Long) As Integer
Dim i As Long, j As Long, k As Long, m As Long
For i = 1 To n - 1
m = i
For j = m + 1 To n
If a(i) > a(j) Then k = k + 1
Next
Next
arr = (-1) ^ k
End Function
模块3
递归法求阶乘
Option Explicit
'//递归法求阶乘
Public Function JC(n As Long) As Double
If n < 2 Then JC = 1: Exit Function
JC = n * JC(n - 1)
End Function
基本控件如图
  command1为计算command2为重试
推广到高阶行列式
以上代码只适用10阶一下行列式的计算，原因是限于模块1代码递归法求全排列只能对123....89求全排列但大于9就出现了两位数，不能再 返回其所要的全排列，但不是不能避免的，我们可以用单个字符来代替多位数，在返回全排列存入所需数组后再用ASCII 一一对应返回其数值，再进行计算，也许有人会说当我们用完所有字符怎么办呢，但100行列式我们要计算10000个数的全排列的逆序等，其计算量已是赫然10的160次方的大数，恐怕计算机也无能为力，再则那样实际意义已经不是很大！当然，我们可以开发更好程序去计算，毕竟知识是无界的！
本代码版权保留，仅供技术交流，不得用于商业用途！
更优的算法
其实完全可以用二维数组完成如人的上三角算法,先判定aii是否为零,如是则交换至非零,再上减下直至上三角,再aii连乘即可,算法规模为n^3.至于更好的,可能还有.
一些参考资料
（英文） Michael Artin, Algebra; Henri Cartan, Cours de calcul différentiel, Paris, Hermann, 1977 ; Pierre Gabriel, Matrices, géométrie, algèbre linéaire维基百科