【发布时间】:2016-09-17 21:57:15
【问题描述】:
为什么在使用c++特征库做矩阵乘积时需要使用noallias()表达式?
m1.noalias() += (s1*s2*conj(s3)*s4) * m2.adjoint() * m3.conjugate()
我一直在阅读一些关于它的注释,但仍然觉得很难理解。
【问题讨论】:
为什么在使用c++特征库做矩阵乘积时需要使用noallias()表达式?
m1.noalias() += (s1*s2*conj(s3)*s4) * m2.adjoint() * m3.conjugate()
我一直在阅读一些关于它的注释,但仍然觉得很难理解。
【问题讨论】:
当你做这样的总和时:
A=A+B
eigen 可以直接使用变量 A 进行运算,因为矩阵的每个单元格都可以计算而不影响其他单元格的计算Ai,j=Ai,j+Bi,j
当你在做这样的产品时:
A=A*B
你不能这样做,因为如果你开始计算并替换A0,0 - 那么你就不能计算另一个A0,j
所以默认情况下 - 在执行产品操作的分配时,会创建一个临时结构并在之后完成分配(请参阅noalias)。
当您在赋值的源术语上使用 noalias 时,您“保证”分配的变量不是产品术语的一部分,并且不使用临时结构是安全的。
这是因为 Eigen 在执行操作时“懒惰”(这意味着它只在必要时才这样做,而不是像我们在标准 C++ 中习惯的那样立即执行) - noalias 是告诉你的方式特征在于,在进行产品操作并将其分配给变量时,这样做也是安全的。
【讨论】: