使用C++本征库时,为什么在做矩阵乘积时必须使用noallias()表达式?
m1.noalias() += (s1*s2*conj(s3)*s4) * m2.adjoint() * m3.conjugate()
我一直在阅读有关它的笔记,但仍然很难理解。
最佳答案
当你做一个像这样的总和时:
A=A+B
本征可以直接使用变量A进行运算,因为可以在不影响其他单元格计算的情况下计算矩阵的每个单元格
Ai,j=Ai,j+Bi,j
当您使用类似以下产品时:
A=A*B
您不能执行相同的操作,因为如果您开始计算并替换
A0,0
,则无法计算其他A0,j
因此,默认情况下-执行产品操作的分配时,会创建一个临时结构,然后再进行分配(请参见noalias)。
在分配的源术语上使用
noalias
时,您可以“保证”所分配的变量不属于产品术语的一部分,并且可以安全地不使用临时结构。这是因为Eigen在执行操作时会“懒惰”(这意味着它仅在必要时才执行,而不是像我们在标准C++中那样立即执行)-
noalias
是告诉Eigen这也是一种方式产品操作并将其分配给变量时可以安全地执行操作。