作为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界面中的这种“默认期望混合”是否有一些设计依据?