C / C ++矩阵乘法顺序

时间:2013-07-18 23:33:38

标签: c++ math opengl glm-math

在数学中,如果三个矩阵,'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 *()如何以这种方式运行?

修改

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

2 个答案:

答案 0 :(得分:6)

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

但是,

Matrix multiplication is associative,所以这不应该影响你。

答案 1 :(得分:3)

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

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