将非信号 NaN 解释为 Eigen 中缺失数据点的操作

Operations that interpret non-signaling NaNs as missing data points in Eigen

在 numpy 中,有像 nanmean() 这样的函数将安静的 NaN 视为缺失数据,即仅对有限元素求和并除以有限元素的数量。这会产生非常干净和可读的代码。

Eigen 中有对应的函数吗?目前我需要实现掩码卷积,因此点积的掩码版本会有所帮助。

似乎 Eigen 本身并未实现任何此功能。一般来说,看起来你能做的最好的事情就是通过 select 将 NaN 值替换为其他值:例如,以下将 x 小于 3 的元素替换为 0

x = (x.array() < 3).select(0, x);

对于点积,我们可以使用 select 来模拟 nandot,因为忽略 nans 与用零替换它们是一样的。使用 x != x 检查 x 是否为 NaN

template <typename OtherDerived>
inline Scalar nandot(const MatrixBase<OtherDerived>& other) const {
  const auto& no_nan_this = (this->array() == this->array()).select(*this, 0);
  const auto& no_nan_other = (other.array() == other.array()).select(other, 0);
  return no_nan_this.dot(no_nan_other);
}

这看起来有点令人费解,但它实际上可能是最好的方法,因为 Eigen 的模板魔术和懒惰的评估,即我怀疑创建 no_nan_this 实际上循环遍历向量替换 nan 的零,而是创建一个包装器对象,returns 索引到适当的值。

我放在上面方框里的代码是想作为插件添加到MatrixBase class中,所以你可以直接调用x.nandot(y):把它放在自己的头文件(比如 matrix_extensions.h)然后 #define EIGEN_MATRIXBASE_PLUGIN "matrix_extensions.h",然后再包含 Eigen 头文件。有关详细信息,请参阅 http://eigen.tuxfamily.org/dox/TopicCustomizingEigen.html