为什么Eigen对别名的默认假设不一致?

时间:2019-05-16 13:46:19

标签: c++ eigen eigen3

作为Eigen的新手,我要努力应对一些问题。

通过矩阵乘法,Eigen默认情况下会创建一个临时文件以避免混叠问题:

matA = matA * matA; // works fine (Eigen creates a temporary before assigning)

如果可以安全地假定没有混叠,则可以使用.noalias()进行优化:

matB = matA * matA; // sub-optimal (due to unnecessary temporary)
matB.noalias() = matA * matA; // more efficient

因此,Eigen在默认情况下会避免做出不安全的假设,除非明确告诉您可以假设没有混叠是安全的。到目前为止一切顺利。

但是,对于其他许多表达式,例如a = a.transpose(),Eigen默认情况下会做出不安全的假设(不存在混叠问题),并且需要进行明确干预来避免该不安全的假设:

a = a.transpose().eval(); // or alternatively: a.transposeInPlace()

因此,如果我们关注效率,则仅当存在潜在的混叠时才注意不够,而当没有潜在的混叠时则不足以注意。当存在潜在的混叠时,我们必须小心两者,当没有潜在的混叠时,我们必须,并根据表达式是否涉及矩阵来决定是否需要进行特殊干预是否相乘。在Eigen中,对于Eigen界面中的这种“默认期望混合”是否有一些设计依据?

0 个答案:

没有答案