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

时间:2015-05-06 04:11:52

标签: nan eigen convolution

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

在Eigen中是否存在此类功能的对应物?目前我需要实现一个蒙版卷积,因此点击产品的蒙版可以提供帮助。

1 个答案:

答案 0 :(得分:2)

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

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

对于点积,我们可以使用nandot模拟select,因为忽略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用零替换,而是创建一个包装器对象,在索引时返回适当的值。

我在上面的框中添加的代码旨在作为插件添加到MatrixBase类中,因此您只需调用x.nandot(y):将其放在自己的头文件中(例如{{} 1}})然后在包含Eigen标头之前matrix_extensions.h。有关详细信息,请参阅http://eigen.tuxfamily.org/dox/TopicCustomizingEigen.html