2

在数学中,如果将三个矩阵“A”、“B”和“C”相乘,得到第四个矩阵“D = A * B * C”,则必须从右到左计算顺序。用括号来说明,前面的语句完全等价于下面的语句;'D = (A * (B * C))'。

您可以看到这如何适用于表达式 '{ M = A * B * C * D } == { M = (A * (B * (C * (D)))) }',这是另一个示例。

在 C、C++ 中,我使用除法进行了测试,以检查在 C 和 C++ 中执行操作的顺序。

但是,我编译汇编代码可能有更好的方法来执行此操作:

float a = 1.0;
float b = 2.0;
float c = 2.0;
float ans = a / b / c;
printf("answer is %f\n", ans);

这给出了输出:

answer is 0.25

这向我表明,如果我要创建一个类来表示矩阵,那么乘法的顺序将是从左到右,这与所需的相反,因为具有浮点运算和除法的示例是从左到右评估的这三个操作具有相同的优先级。

在 OpenGL 数学库 GLM 中,矩阵运算以正确的顺序计算,不需要括号。

如何使 operator*() 以这种方式运行?

编辑

呃,是的,所以它实际上并不重要,因为它已经向我指出了。在这种情况下,我的问题变成“是否可以更改订单”?(也许我困了?)

4

2 回答 2

6

C++/和二元*运算符都是从左到右关联的。故事结束 - 没有办法改变它。

矩阵乘法associative,所以这不应该影响你。

于 2013-07-18T23:47:37.603 回答
3

原因很简单:矩阵乘法是关联的;标量除法不是(A / (B / C))不一样((A / B) / C)。但是对于矩阵和标量乘法,(A * (B * C))与 相同。((A * B) * C)

因此,C++ 调用运算符的顺序对矩阵乘法无关紧要。

于 2013-07-18T23:42:28.690 回答