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 * c
和 c * b
能够编译,因为 c
被隐式转换为二维向量而没有任何警告。就这么简单,但很混乱!
【讨论】:
以上是关于GLM的向量矩阵乘法行为?的主要内容,如果未能解决你的问题,请参考以下文章