代码之家  ›  专栏  ›  技术社区  ›  Adam Naylor

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

  •  3
  • Adam Naylor  · 技术社区  · 17 年前

    这是约翰·卡马克用来计算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 回复  |  直到 17 年前
        1
  •  5
  •   laura    17 年前

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

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

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

        2
  •  2
  •   ilya n.    17 年前

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

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

    在这里 minor[0, i] 是你通过划掉得到的矩阵 0 第三行 i -原始矩阵的第列和 (-1)*i 代表 我 第四电源 -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]] 这就得出了公式

    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 矩阵。