c++ - 使用 Eigen C++ 进行快速一维卷积?

标签 c++ eigen

假设我有两个数据数组:

double data[4096] = { .... };
double b[3] = {.25, .5, .25};

我想要一个快速且可移植的卷积实现。使用 NumPy 语法

result = numpy.convolve(data, b, "same")

内核大小很小,为 3 或 5,我可能必须与带有零的内核进行卷积(可能为进一步优化提供范围)。

double b[5] = {.25, .0, .5, .0, .25};

我有一种感觉 Eigen C++ 已经为此优化了代码,但我不知道如何使用它。或者,是否有其他库具有可移植的卷积实现,并且针对常见平台进行了理想优化?

最佳答案

Armadillo应该可以满足您的需求。

Eigen 实现可能如下所示:

Eigen::VectorXd convolve(const Eigen::Ref<const Eigen::VectorXd>& in,
      const Eigen::Vector3d& weights)
{
    const Eigen::Index innersize = in.size() - 2;
    Eigen::VectorXd out(in.size());
    out.segment(1, innersize) =
          in.head(innersize) * weights.x() +
          in.segment(1, innersize) * weights.y() +
          in.tail(innersize) * weights.z();
    // Treat borders separately
    return out;
}

以同样的方式展开 5 个重量。

关于c++ - 使用 Eigen C++ 进行快速一维卷积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72360602/

相关文章:

c++ - libpcap (>1.0.0) 和 PF_RING 效率

c++ - Eigen : solving A=xB (Assert failed)

cython - 在 Cython 中设置 Eigen::Matrix3d 的系数/元素

C++ DLL 特殊字符

c++ - 比较整数 C++

c++ - 如何将 CMake 中的 QtMain 与 Qt5 链接?

c++ - 自定义 QAbstractItemModel 和 QTableView 中的错误选择

c++ - 使用 Eigen 和为自动微分设计的自定义复数

C++ - Fastor vs. Eigen vs C-tran : Speed differences in tensor contraction

c++ - 条件断点失败的 GDB Eigen 调试