有谁能告诉我哪个是找到大小为N x N
的矩阵的行列式值的最佳算法?
答案 0 :(得分:27)
Here是一个广泛的讨论。
有很多算法。
一个简单的方法是采用LU
decomposition。然后,因为
det M = det LU = det L * det U
且L
和U
都是三角形,行列式是L
和U
的对角元素的乘积。那是O(n^3)
。存在更有效的算法。
答案 1 :(得分:9)
找到nxn矩阵的行列式的最简单方法(并且不是坏方法)是通过行减少。通过记住关于决定因素的一些简单规则,我们可以用以下形式解决:
det( A )=α* det( R ),其中 R 是原始矩阵的行梯队形式 A ,α是一些系数。
以行梯形形式查找矩阵的行列式非常简单;你只需找到对角线的产物。解决原始矩阵 A 的行列式然后归结为计算α,因为您发现行梯形 R 。
有关简单定义,请参阅此link 注意:并非所有定义都需要1个前导条目,并且此算法不需要。
交换行,添加另一行的倍数等
如果 B 是通过将一行 A 乘以某个非零常数ß获得的矩阵,那么
det( B )=ß* det( A )
如果 B 是通过交换两行 A 获得的矩阵,那么
det( B )= -det( A )
如果 B 是通过将一行的倍数添加到 A 中的另一行而获得的矩阵,则
det( B )= det( A )
请注意,在大多数情况下,你可以找到决定因素,只有规则3(当我的A的对角线没有零时,我相信),并且在所有情况下只有规则2和3.规则1对人类有用在纸上做数学,试图避免分数。
(我做了不必要的步骤来更清楚地演示每条规则)
| 2 3 3 1 |
A=| 0 4 3 -3 |
| 2 -1 -1 -3 |
| 0 -4 -3 2 |
R2 <-> R3, -α -> α (Rule 2)
| 2 3 3 1 |
-| 2 -1 -1 -3 |
| 0 4 3 -3 |
| 0 -4 -3 2 |
R2 - R1 -> R2 (Rule 3)
| 2 3 3 1 |
-| 0 -4 -4 -4 |
| 0 4 3 -3 |
| 0 -4 -3 2 |
R2/(-4) -> R2, -4α -> α (Rule 1)
| 2 3 3 1 |
4| 0 1 1 1 |
| 0 4 3 -3 |
| 0 -4 -3 2 |
R3 - 4R2 -> R3, R4 + 4R2 -> R4 (Rule 3, applied twice)
| 2 3 3 1 |
4| 0 1 1 1 |
| 0 0 -1 -7 |
| 0 0 1 6 |
R4 + R3 -> R3
| 2 3 3 1 |
4| 0 1 1 1 | = 4 ( 2 * 1 * -1 * -1 ) = 8
| 0 0 -1 -7 |
| 0 0 0 -1 |
答案 2 :(得分:7)
如果您进行了初步研究,您可能会发现,当N> = 4时,矩阵行列式的计算变得非常复杂。关于算法,我会指向Wikipedia article on Matrix determinants,特别是“算法实现”部分。
根据我自己的经验,您可以在现有的矩阵库中轻松找到LU或QR分解算法,例如Alglib。算法本身并不是很简单。
答案 3 :(得分:0)
我对LU分解并不太熟悉,但我知道为了获得L或U,你需要使初始矩阵为三角形(U为上三角形或L为下三角形)。然而,一旦你得到一些nxn矩阵A的三角形矩阵并假设你的代码使用的唯一操作是Rb - k * Ra,你可以从i = 0求解det(A)=ΠT(i,i)到n(即det(A)= T(0,0)x T(1,1)x ... x T(n,n))对于三角矩阵T.检查此链接以查看我在说什么关于。 http://matrix.reshish.com/determinant.php