Math 这是哪种矩阵行列式计算方法?

Math 这是哪种矩阵行列式计算方法?,math,matrix,Math,Matrix,这是John Carmack用来计算4x4矩阵行列式的方法。从我的调查中,我已经确定它一开始像拉普拉斯展开定理,但接着计算3x3行列式,这似乎与我读过的任何论文都不一致 // 2x2 sub-determinants float det2_01_01 = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]; float det2_01_02 = mat[0][0] * mat[1][2] - mat[0][2] * mat[1][0

这是John Carmack用来计算4x4矩阵行列式的方法。从我的调查中,我已经确定它一开始像拉普拉斯展开定理,但接着计算3x3行列式,这似乎与我读过的任何论文都不一致

    // 2x2 sub-determinants
    float det2_01_01 = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0];
    float det2_01_02 = mat[0][0] * mat[1][2] - mat[0][2] * mat[1][0];
    float det2_01_03 = mat[0][0] * mat[1][3] - mat[0][3] * mat[1][0];
    float det2_01_12 = mat[0][1] * mat[1][2] - mat[0][2] * mat[1][1];
    float det2_01_13 = mat[0][1] * mat[1][3] - mat[0][3] * mat[1][1];
    float det2_01_23 = mat[0][2] * mat[1][3] - mat[0][3] * mat[1][2];

    // 3x3 sub-determinants
    float det3_201_012 = mat[2][0] * det2_01_12 - mat[2][1] * det2_01_02 + mat[2][2] * det2_01_01;
    float det3_201_013 = mat[2][0] * det2_01_13 - mat[2][1] * det2_01_03 + mat[2][3] * det2_01_01;
    float det3_201_023 = mat[2][0] * det2_01_23 - mat[2][2] * det2_01_03 + mat[2][3] * det2_01_02;
    float det3_201_123 = mat[2][1] * det2_01_23 - mat[2][2] * det2_01_13 + mat[2][3] * det2_01_12;

    return ( - det3_201_123 * mat[3][0] + det3_201_023 * mat[3][1] - det3_201_013 * mat[3][2] + det3_201_012 * mat[3][3] );
有人能给我解释一下这种方法是如何工作的,或者给我指出一篇使用同样方法的好文章吗

注意

如果重要的话,这个矩阵是行主矩阵。

它似乎是一种使用子矩阵的方法。数学方面可以在维基百科的


基本上,你把矩阵简化成更小更容易计算的东西,然后把这些结果加起来(它涉及一些(-1)因素,这些因素应该在我链接的页面上描述)

他使用标准公式,你可以用伪代码计算

det(M) = sum(M[0, i] * det(M.minor[0, i]) * (-1)^i)
这里的
minor[0,i]
是一个矩阵,您可以从原始矩阵中划掉
0
-第行和
i
-第列,
(-1)*i
表示
i
-的次方

如果您选择不同的行或在列上进行循环,则相同的(最多一个总号)公式将起作用。如果你想一想
det
是如何定义的,这是非常不言自明的。请注意,对于2矩阵,这将变成:

det(M) = M[0, 0] * M[1, 1] * (+1) + M[0, 1] * M[1, 0] * (-1)
或者,通过第1行而不是第0行

-det(M) = M[1, 0] * M[0, 1] * (+1) + M[1, 1] * M[0, 0] * (-1)
–您应该了解
2x2
矩阵行列式的标准公式

类似地,对于由
N=[[a,b,c],[d,e,f],[g,h,i]]组成的3-矩阵,

det(N) = a * det([[e, f], [h, i]]) - b * det([[d, f], [g, i]]) + c * det([[d, e], [g, h]])
这当然成为教科书上的公式

a*e*i + b*f*g +  c*d*h - c*e*g - a*f*h - b*d*i
展开每个
2x2
行列式后


现在,如果你取一个4-矩阵
X
,你会发现要计算
det(X)
,你需要计算4个子矩阵的行列式,每个子矩阵是一个
3x3
矩阵;但是你也可以进一步扩展它们,这样你就有了6
2x2
矩阵和一些系数的行列式。你真的应该亲自尝试一下,就像上面为
3x3
矩阵所做的一样。

是的,就是这样。。简单的展开拉普拉斯展开。如果你想要更多的信息,你还应该搜索“辅因子展开”,可能会出现舍入错误。数据透视通常使用一些逻辑来避免通过选择(例如)最大的数字作为数据透视来减去可能接近的数字。是的,就2x2矩阵行列式而言,我理解它,但我看不出哪里需要3x3?为了回答你狭窄的问题,我引用的公式说:(1)计算一些
3x3
矩阵的
det
;(2) 将它们与系数相加。方法是将NxN行列式计算简化为N-1xN-1行列式的计算,然后继续计算,直到减少到2x2。因此,4x4减少到3x3左右,从而减少到2x2以上。