关于数学:C / C矩阵乘法顺序

C / C++ Matrix Multiplication Order

在数学中,如果将三个矩阵\\'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中执行操作的顺序。

也许有一种更好的方式来编译我的汇编代码,但是:

1
2
3
4
5
6
float a = 1.0;
float b = 2.0;
float c = 2.0;
float ans = a / b / c;
printf("answer is %f\
"
, ans);

这给出了输出:

1
answer is 0.25

这向我暗示,如果我要创建一个代表矩阵的类,则乘法顺序将从左到右,与期望的顺序相反,因为带有浮点运算和除法的示例是左计算的向右,因为这三个操作具有相同的优先级。

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

如何使operator *()表现为这种方式?

编辑

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


C /和二进制*运算符都是从左到右的关联。故事的结尾-无法更改。

但是,矩阵乘法是关联的,因此不会影响您。


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

因此C调用运算符的顺序与矩阵乘法无关。