gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:31:10 25 4
gpt4 key购买 nike

我绝不是数学家,我正试图了解 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com