2016-03-03 210 views
2

为什么在使用C++特征库时需要使用noallias()表达式进行矩阵乘积运算?特征矩阵乘法

m1.noalias() += (s1*s2*conj(s3)*s4) * m2.adjoint() * m3.conjugate() 

我一直在阅读关于它的一些笔记,但仍然觉得很难理解。

回答

4

当你正在做类似的总和:

A=A+B 

本征可以直接使用变量A来执行该操作,因为,该矩阵的每个单元可以在不影响其它细胞的计算来计算Ai,j=Ai,j+Bi,j

当你正在做一个产品,如:

A=A*B 

,因为如果你开始计算你不能做同样的nd替换A0,0 - 那么您无法计算其他A0,j

因此默认情况下 - 在执行产品操作分配时,会创建一个临时结构,并在随后完成分配(请参见noalias)。

当您在作业的源项上使用noalias时,您“保证”所分配的变量不是产品条款的一部分,并且不使用临时结构是安全的。

这是来自于Eigen在执行操作时是“懒惰”的事实(意味着它仅在必要时才会执行,而不是像我们习惯于在标准C++中那样执行) - 是告诉Eigen当进行产品操作并将其分配给变量时,这也是安全的。