如果某些除法器可能为 0,如何处理 Eigen 中的逐元素除法?
我希望结果为 0。
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
ArrayXd a(3), b(3), c;
a << 1, 2, 0;
b << 1.2, 3.4, 5.6;
c = b / a;
}
最佳答案
如果您的编译器在自动向量化方面相当出色,您可以使用 Eigen 的 .select( )
机制:
c = (a!=0).select(b/a, 0.0);
Clang 6 或更新版本(使用 -O3 -DNDEBUG -march=skylake
)会将其主循环编译为等效于:
vmovupd ymm1, ymmword ptr [rax]
vcmpneqpd ymm2, ymm1, ymm0
vmaskmovpd ymm3, ymm2, ymmword ptr [rdx]
vdivpd ymm1, ymm3, ymm1
vandpd ymm1, ymm2, ymm1
vmovupd ymmword ptr [rax], ymm1
唯一轻微的性能改进是避免使用 vmaskmovpd
——但从编译器的角度来看这是必要的,因为严格来说,b[i]
不会被读取对于每个i
,其中a[i]==0
。
关于c++ - Eigen,如何处理按元素除以零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72478246/