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

3

这是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] );

能有人向我解释一下这种方法是如何工作的,或者给我指一篇使用相同方法的好文章吗?

注意:
如果重要的话,该矩阵是行主序的。

2个回答

5

没错 - 就是这样。简单展开拉普拉斯展开式。 - Nils Pipenbrinck
如果您想获取更多信息,还应搜索“余子式展开”。 - Martijn
而且很可能会存在舍入误差。旋转通常使用一些逻辑来避免通过选择(例如)最大数作为枢轴来减去可能非常接近的数字。 - Alexandre C.

2
他使用标准公式,在伪代码中可以计算出:
det(M) = sum(M[0, i] * det(M.minor[0, i]) * (-1)^i)

这里的minor[0, i]是通过从原矩阵中划掉第0行和第i列得到的矩阵,(-1)*i表示-1i次幂。同样(除了整体符号),如果您选择不同的行或循环列,该公式也适用。如果您考虑如何定义det,它就非常容易理解了。请注意,对于2乘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),其中每个较小的矩阵都是3x3矩阵;但是您也可以进一步扩展它们,因此您将具有6个2x2矩阵的行列式,其中包含某些系数。 您应该尝试自己类似于上面的3x3矩阵。


我理解到了2x2矩阵行列式的部分,但是我不明白为什么需要3x3的矩阵? - Adam Naylor
回答你的具体问题,我引用的公式是:(1)计算某些3x3矩阵的行列式; (2)带有系数将它们相加。 - ilya n.
这种方法是将一个NxN行列式的计算降级为N-1xN-1行列式的计算,并重复该步骤直至降级到2x2。因此,4x4的行列式会降级为若干个3x3的行列式,再继续降级为更多的2x2行列式。 - David Thornley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接