GLM的向量矩阵乘法行为?

Posted

技术标签:

【中文标题】GLM的向量矩阵乘法行为?【英文标题】:Vector matrix multiplication behavior with GLM? 【发布时间】:2019-10-30 09:03:58 【问题描述】:

我绝不是数学家,我试图了解 GLM 在向量和矩阵之间的乘法会发生什么。据我了解,GLM 的矩阵大小为列 x 行,并且在 GLM 中的普通矩阵乘法中,表达式的左侧必须具有与右侧具有相同数量的行。所以这就是我的问题所在。

让我困惑的是我可以将一个 2x3 矩阵乘以一个三维向量

| 1, 4 |
| 2, 5 | x [ 1, 2, 3 ]
| 3, 6 |

给我[ 9, 12, 15 ]的答案。但我也可以将 3x2 矩阵乘以相同的 3D 向量

| 1, 3, 5 |
| 2, 4, 6 | x [ 1, 2, 3 ]

我现在得到一个[ 22, 28 ] 的二维向量。为什么这可能?这里发生了什么?

让我更困惑的是,我可以切换顺序并将向量放在左侧,将矩阵放在右侧,我仍然得到一个有效的结果。再次,为什么这可能?怎么了?这是 GLM 特有的行为,还是标准的矩阵行为?

如果这是简单的数学,我深表歉意,但是经过数小时的互联网搜索和自己使用 GLM 的测试后,我仍然不明白这个概念。我感谢任何帮助。谢谢。

编辑:这是一个代码示例

#define GLM_ENABLE_EXPERIMENTAL

#include <iostream>
#include <glm/mat2x3.hpp>
#include <glm/mat3x2.hpp>
#include <glm/gtx/string_cast.hpp>

int main() 
    glm::mat2x3 a = 
        1, 2, 3, 
        4, 5, 6
    ;

    glm::mat3x2 b = 
        1, 2,
        3, 4,
        5, 6
    ;

    glm::vec3 c = 
       1, 2, 3
    ;

    // These all compile correctly? And each gives different results.
    std::cout << glm::to_string(a * c) << std::endl;
    std::cout << glm::to_string(c * a) << std::endl;
    std::cout << glm::to_string(b * c) << std::endl;
    std::cout << glm::to_string(c * b) << std::endl;

控制台输出如下

vec3(9.000000, 12.000000, 15.000000)
vec2(14.000000, 32.000000)
vec2(22.000000, 28.000000)
vec3(5.000000, 11.000000, 17.000000)

【问题讨论】:

矩阵定义为 X 行列。您的可视化是错误的(向量相同) @RoQuOTriX 行长 X 列长,还是行数 X 列数?很抱歉造成混乱。 我认为正确的是行数 X 列数。我不明白你的意思是一行的长度?这一行有多少个元素?这将是列的数量,反之亦然......如果你有 3x1 矩阵(一个向量),它有 3 行和 1 列,而不是 1 行和 3 列 你用glm标记了这个,你的意思是glm-math吗? @genpfault 拍摄,你是对的。谢谢指正。 【参考方案1】:

我发现发生了什么事!这个问题最终与矩阵无关,而是 GLM 的一个怪癖。在代码示例中,a * cc * b 能够编译,因为 c 被隐式转换为二维向量而没有任何警告。就这么简单,但很混乱!

【讨论】:

以上是关于GLM的向量矩阵乘法行为?的主要内容,如果未能解决你的问题,请参考以下文章

3D 空间中的 OpenGL 2D 文本 [C++/GLM] 矩阵乘法

GLM 中的模型矩阵

GLM:如何转置向量?

向量矩阵乘法、浮点向量、二进制矩阵

向量乘法(矩阵乘法)奇数输出的向量

GLM:如何创建一个 9 列和 3 行的矩阵