GLM 中的矩阵除法

Posted

技术标签:

【中文标题】GLM 中的矩阵除法【英文标题】:Matrix Division in GLM 【发布时间】:2020-07-23 00:46:06 【问题描述】:

我目前正在试验 OpenGL,我遇到了一种情况,我想找到 4x4 矩阵 x 其中 x * mat1 = mat2 (我认为是列主要顺序。其中 x * mat1 表示应用转换mat1,然后是x。)。

自然想到解决办法可能是x = mat2 / mat1,于是用glm试了一下。它奏效了!以下 sn-p 将输出 true

glm::mat4 mat1 = glm::translate(glm::vec31,2,3);
glm::mat4 mat2 = glm::scale(glm::vec3-1,-2,-3);

glm::mat4 x = mat2 / mat1;
std::cout << ((x * mat1) == mat2) << std::endl;

但后来,我意识到mat1 * x != x * mat1! 这有什么意义? mat2 / mat1 会模棱两可!我的除法解决方案对于找到 x 是否令人满意或有任何警告? (同样,我的目标是拥有x * mat1 = mat2

我也遇到过这个讨论:https://math.stackexchange.com/questions/228229/is-division-of-matrices-possible?newreg=c7fd79a48ae54ed694af1ee5f4646af7

【问题讨论】:

【参考方案1】:

没有矩阵除法之类的东西。但是,标量除法只是乘以标量值的倒数。因此,可以(和 GLM 一样)将“矩阵除法”定义为同一件事:乘以逆。

所以你的mat2 / mat1 真的是mat2 * glm::inverse(mat1)

至于交换性,我们看这里的代数。你从这个开始:

x * mat1 = mat2

你想解决x。因此,您将两边都乘以一个从等式左侧删除mat1 的值。即glm::inverse(mat1)

然而,因为矩阵乘法是不可交换的,你知道做glm::inverse(mat1) * (x * mat1)实际上并没有去掉等式左边的mat1。因此,您必须-乘以倒数以摆脱mat1

而且由于代数变换只有在对两边进行完全相同的运算时才有效,所以还必须在右侧进行右乘:

(x * mat1) * glm::inverse(mat1) = mat2 * glm::inverse(mat1)

所以顺序没有歧义;如果你按错误的顺序做,你会得到错误的答案。

【讨论】:

以上是关于GLM 中的矩阵除法的主要内容,如果未能解决你的问题,请参考以下文章

标量的OpenCV双矩阵除法产生不正确的结果

python怎么实现矩阵的除法

整数除法矩阵之和

HDU6395-Sequence 矩阵快速幂+除法分块

OpenCV矩阵元素除法给出全零结果

Objective-C - 使用 Accelerate.framework 对两个矩阵进行元素加法(和除法)