在使用c ++特征库时,为什么在使用矩阵乘积时需要使用noallias()表达式?
m1.noalias() += (s1*s2*conj(s3)*s4) * m2.adjoint() * m3.conjugate()
我一直在阅读有关它的一些注释,但仍然觉得很难理解。
答案 0 :(得分:5)
当你做一笔总结时:
A=A+B
eigen可以直接使用变量A来执行操作,因为矩阵的每个单元都可以在不影响其他单元格的计算的情况下进行计算Ai,j=Ai,j+Bi,j
当您使用以下产品时:
A=A*B
你不能这样做,因为如果你开始计算并替换A0,0
- 那么你就无法计算另一个A0,j
默认情况下 - 执行产品操作的分配时,会创建一个临时结构,然后完成分配(参见noalias)。
当您在作业的源术语上使用noalias
时,您“保证”指定的变量不属于产品的条款,并且不使用临时结构是安全的。
这是因为Eigen在执行操作时“懒惰”(意味着只在必要时才这样做,而不是像我们在标准C ++中那样立即执行) - noalias
就是这样告诉Eigen在进行产品操作并将其分配给变量时这也是安全的。