【问题标题】:Which method of matrix determinant calculation is this?这是哪种矩阵行列式计算方法?
【发布时间】:2009-08-14 08:06:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: math matrix


    【解决方案1】:

    这似乎是涉及使用未成年人的方法。数学方面可以在维基百科上找到

    http://en.wikipedia.org/wiki/Determinant#Properties_characterizing_the_determinant

    基本上,您将矩阵简化为更小且更易于计算的矩阵,并将这些结果相加(它涉及一些 (-1) 因素,应在我链接到的页面上进行描述)。

    【讨论】:

    • 是的 - 就是这样......简单的展开拉普拉斯展开。
    • 如果您想了解更多信息,您还应该搜索“辅因子扩展”
    • 并且可能容易出现舍入错误。透视通常使用一些逻辑来避免通过选择(例如)最大的数字作为透视来减去可能接近的数字。
    【解决方案2】:

    他使用标准公式,您可以在其中以伪代码进行计算,

    det(M) = sum(M[0, i] * det(M.minor[0, i]) * (-1)^i)
    

    这里minor[0, i] 是一个矩阵,您可以通过从原始矩阵中删除0-th 行和i-th 列来获得矩阵,(-1)*i 代表i-th power of -1

    如果您采用不同的行或在列上进行循环,则相同的(最多一个整体符号)公式将起作用。如果您考虑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)计算det 一些3x3 矩阵; (2) 将它们与系数相加。
    • 该方法是将 NxN 行列式计算减少为 N-1xN-1 行列式的计算,并继续直到降至 2x2。因此,4x4 减少到一些 3x3s,这减少到更多的 2x2s。
    猜你喜欢
    • 1970-01-01
    • 2013-05-12
    • 2015-01-16
    • 1970-01-01
    • 2018-11-19
    • 2015-09-11
    • 1970-01-01
    • 2013-08-09
    • 2014-02-08
    相关资源
    最近更新 更多