为什么在使用C++ Eigen库进行矩阵乘法时需要使用noalias()表达式?
m1.noalias() += (s1*s2*conj(s3)*s4) * m2.adjoint() * m3.conjugate()
我已经阅读了一些关于IT技术的笔记,但仍然觉得难以理解。
A=A+B
eigen可以直接使用变量A来执行操作,因为矩阵的每个单元格都可以在不影响其他单元格计算的情况下进行计算:Ai,j=Ai,j+Bi,j
当你进行像这样的乘积运算时:
A=A*B
由于如果您开始计算并替换A0,0
,则无法计算其他A0,j
,因此您无法执行相同操作。
因此,默认情况下,在执行乘积操作的赋值时,会创建一个临时结构,然后进行赋值(请参见noalias)。
当您在赋值的源术语上使用noalias
时,您“保证”被赋值的变量不是乘积项的一部分,并且可以安全地不使用临时结构。
这源于Eigen在执行操作时的“懒惰”(意思是它仅在必要时执行操作,而不像我们在标准C ++中所使用的那样立即执行)- noalias
是告诉Eigen在执行乘积操作并将其分配给变量时,这也是安全的方法。