使用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这也是一种方式产品操作并将其分配给变量时可以安全地执行操作。

10-08 01:51