c++ - GLM 的 vector 矩阵乘法行为?

标签 c++ math matrix glm-math

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

让我感到困惑的是我可以将一个 2x3 矩阵乘以一个三维 vector

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

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

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

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

更让我困惑的是,我可以调换顺序,把 vector 放在左边,把矩阵放在右边,我仍然得到一个有效的结果。同样,为什么这可能?怎么了?这是 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)

最佳答案

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

关于c++ - GLM 的 vector 矩阵乘法行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58621772/

相关文章:

c++ - 未收到 C++ 代码的预期输出

python - 将 Numpy 数组中的所有行对相乘

swift - 如何使用 Surge 获取矩阵值

C++:在继承链中放置构造函数的位置?

c++ - 在 C++ 中每行读取文本文件,行长度未知

java - 使用 Canvas 和 Path 围绕一个点进行 2d 旋转

java - 泰勒级数的正弦计算不起作用

javascript - 尝试对数字的每一位进行平方,但我的算法不起作用?

python - 在Python中构建由替代对象组成的矩阵

c++ - 是否可以使用 ICU 以任意编码从字符串中提取 'trim' 尾随空格/制表符而不进行任何转换