特征矩阵乘法 当使用C++特征库时,为什么要使用NoLigas()表达式来表达矩阵乘积?< /P> m1.noalias() += (s1*s2*conj(s3)*s4) * m2.adjoint() * m3.conjugate()

特征矩阵乘法 当使用C++特征库时,为什么要使用NoLigas()表达式来表达矩阵乘积?< /P> m1.noalias() += (s1*s2*conj(s3)*s4) * m2.adjoint() * m3.conjugate(),c++,eigen,C++,Eigen,我一直在读一些关于它的笔记,但仍然觉得很难理解。当你做这样的算术时: A=A+B eigen可以直接使用变量A来执行操作,因为可以计算矩阵的每个单元,而不会影响其他单元的计算Ai,j=Ai,j+Bi,j 当您在生产以下产品时: A=A*B 您不能执行相同的操作,因为如果您开始计算并替换A0,0-则无法计算其他A0,j 因此,默认情况下-在执行产品操作的分配时,会创建一个临时结构,然后再进行分配(请参阅) 当您对赋值的源项使用noalias时,您“保证”所赋值的变量不是产品项的一部分,并且不使

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

当你做这样的算术时:

A=A+B
eigen可以直接使用变量A来执行操作,因为可以计算矩阵的每个单元,而不会影响其他单元的计算
Ai,j=Ai,j+Bi,j

当您在生产以下产品时:

A=A*B
您不能执行相同的操作,因为如果您开始计算并替换
A0,0
-则无法计算其他
A0,j

因此,默认情况下-在执行产品操作的分配时,会创建一个临时结构,然后再进行分配(请参阅)

当您对赋值的源项使用
noalias
时,您“保证”所赋值的变量不是产品项的一部分,并且不使用临时结构是安全的

这是因为Eigen在执行操作时“懒惰”(这意味着它只在必要时才这样做,而不是像我们在标准C++中习惯的那样立即这样做)noalias是告诉Eigen在执行产品操作并将其分配给变量时这样做也是安全的