python中4x3矩阵的逆

2024-09-30 20:32:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在重新实现一个名为noesis的封闭源代码3d库。在

它公开一个包含所有基本类的python文件。在

所有的实现细节实际上都是隐藏的。该实现已编译,因此无法预览。在

我想实现mat43Inverse库中的一个函数。在

我知道通常不可能求4x3矩阵的逆,但这个函数是存在的。在

noesis插件的用法示例:

#4x3 matrix
class NoeMat43:

    # ...

    def inverse(self): #returns mat43
        return noesis.mat43Inverse(self)

公开类文件的源:https://github.com/majimboo/mviewer/blob/master/noesis/plugins/python/inc_noesis.py#L478

noesis模块是一个编译的cpython模块。(https://github.com/majimboo/mviewer/blob/master/noesis/plugins/NoesisPython.dll

^{pr2}$

通过调用本机函数并打印结果,我准备了一组正确的结果。在

input = NoeMat43((
    NoeVec3((2.5, 3.6, 4.7)),
    NoeVec3((2.9, 3.1, 4.3)),
    NoeVec3((6.5, 7.6, 8.7)),
    NoeVec3((1.1, 9.4, 3.2))
))

result = input.inverse()
expected = NoeMat43((
    NoeVec3((0.04392901062965393, 0.05095765367150307, 0.1142154261469841)),
    NoeVec3((0.044815145432949066, 0.038590818643569946, 0.09460975229740143)),
    NoeVec3((0.04042314738035202, 0.036982882767915726, 0.07482582330703735)),
    NoeVec3((-0.8928132057189941, -0.714801549911499, -0.6315471529960632))
))
noeassert('mat43Inverse', result, expected)

正确结果

1。在

input: (
(1, 0, 0),
(0, 1, 0),
(0, 0, 1),
(0, 0, 0)
)

inverse result: (
(1.0, 0.0, 0.0),
(0.0, 1.0, 0.0),
(0.0, 0.0, 1.0),
(0.0, 0.0, 0.0)
)

2。在

input: (
(2.5, 3.6, 4.7),
(2.9, 3.1, 4.3),
(6.5, 7.6, 8.7),
(1.1, 9.4, 3.2)
)

invserse result: (
(0.04392901062965393, 0.05095765367150307, 0.1142154261469841),
(0.044815145432949066, 0.038590818643569946, 0.09460975229740143),
(0.04042314738035202, 0.036982882767915726, 0.07482582330703735),
(-0.8928132057189941, -0.714801549911499, -0.6315471529960632)
)

3。在

input: (
(0.0, 0.0, 1.0),
(0.0, 1.0, 0.0),
(-1.0, 0.0, 0.0),
(0.0, 32.29199981689453, -3.2665998935699463)
)

inverse result: (
(0.0, 0.0, -1.0),
(0.0, 1.0, 0.0),
(1.0, 0.0, 0.0),
(-3.2665998935699463, -32.29199981689453, 0.0)
)

4。在

input: (
(0.0, 0.0, 2.0),
(0.0, 2.0, 0.0),
(-2.0, 0.0, 0.0),
(0.0, 32.29199981689453, -3.2665998935699463)
)

inverse result: (
(0.0, 0.0, -0.5),
(0.0, 0.5, 0.0),
(0.5, 0.0, 0.0),
(-1.6332999467849731, -16.145999908447266, 0.0)
)

5。在

input: (
(2.0, 0.0, 2.0),
(0.0, 2.0, 0.0),
(-2.0, 0.0, 0.0),
(0.0, 32.29199981689453, -3.2665998935699463)
)

inverse result: (
(0.2499999850988388, 0.0, -0.2499999850988388),
(0.0, 0.5, 0.0),
(0.5, 0.0, 0.0),
(-0.8166499137878418, -16.145999908447266, 0.0)
)

问题:

  • mat43逆函数背后的公式是什么?在

Tags: 文件函数httpsselfgithubcominputresult
1条回答
网友
1楼 · 发布于 2024-09-30 20:32:56

正如Nico Schertler指出的3D图形中的4x3矩阵通常是4x4一致变换矩阵,其中最后一行或最后一列(取决于使用的约定)被省略并表示(0,0,0,1)向量(无投影)。这样做通常是为了保留空间。在

我懒得检查你的样本,但是如果结果不匹配,你很可能会对矩阵的元素/单元的排序有不同的约定。为了检查正确性,只需将原始矩阵和逆矩阵(都是完全4x4表示)相乘,结果应该是单位矩阵。在

在我所知的3D图形中,有3种计算逆矩阵的方法:

  1. Horner格式/GEM-Gauss消去法

    这是一种可以在纸上使用的直接方法,但在计算机计算中,这不是一个很好的选择,因为它需要一点复杂的排序行,所以结果仍然是反的。这有时会导致反复试验,这意味着以后可能出现性能问题。

  2. 从行列式求逆

    对于未知矩阵,这是最好的选择,因为它不需要排序,并且如果矩阵有逆矩阵,它总是可计算的。如果使用的数字/向量的量值太大,有时会出现精度问题。这里C++中的代码(OpenGL约定):

    在代码中查找matrix_inv函数。

  3. 伪逆矩阵

    在某些情况下,可以避免使用行列式或Horner格式/高斯消去法计算逆矩阵,因为在某些情况下,可以利用正交旋转矩阵Transpose也是其inverse。因此,计算归结为3x3矩阵的简单变换(仅交换元素)和计算线性方程以匹配逆矩阵原点。这大大减少了计算量,因此具有更好的精确度和速度。这是如何完成的(OpenGL约定):

    在那里找子弹3。

相关问题 更多 >