c++ - Eigen,如何处理按元素除以零

标签 c++ eigen

如果某些除法器可能为 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/

相关文章:

c++ - 如何比系统更喜欢 AddFontMemResourceEx 加载的字体?

c++ - Qt C++ 将具有非空签名的信号连接到 lambda

c++ c-string topper函数有时会在最后输出随机数

c++ - 在 C+ +'s Eigen library, how do I solve: invalid use of incomplete type ‘const class Eigen::MatrixSquareRootReturnValue<Eigen::Matrix<float, -1, -1>>’

c++ - 如何使用特征库从旋转矩阵确定轴角

c++ - 调整 Eigen::Ref 大小的解决方法

c++ - 将非二次矩阵转置为另一个

c++ - 在 C++11 中,是否有 std::lock_guard 的变体在构造时解锁并在销毁时锁定?

c++ - 在库 API 中传递 std::string

c++ - 在 Eigen C++ 中关心断言失败的最佳方法是什么?