DenseBase,自动和二进制操作表示数组具有不同的形状

时间:2018-11-15 16:43:23

标签: c++ eigen eigen3

我写了一个以两个DenseBase作为参数的函数。

该函数使用.derived().array()ArrayMatrix都转换为Array

我厌倦了多次写derived并使用自动。

但是auto导致奇怪的错误。 Eigen抱怨x2y2的形状不一样。

如果我不想多次写.derived().array(),该怎么用?

本征来自https://github.com/eigenteam/eigen-git-mirror.git

#include <Eigen/Eigen>
int main() {
    Eigen::ArrayXf x(3);
    Eigen::ArrayXf y(3);
    x << 1, 2, 3;
    y << 4, 5, 6;
    // x.derived().array() * y.derived().array();
    auto x2 = x.derived().array();
    auto y2 = y.derived().array();
    y2 = x2 * y2; 
}

运行时错误:

CwiseBinaryOp.h:110: ...

Assertion `aLhs.rows() == aRhs.rows() 
           && aLhs.cols() == aRhs.cols()' failed.

1 个答案:

答案 0 :(得分:2)

您可以使用auto x2 = x.array().derived();解决运行时问题,即:反向数组和派生。但是auto在这里是不可取的。这就是为什么。说你有:

template <typename T> void foo(DenseBase<T> &x);

如果TArray<>,则x.array().derived()Array<>,而x2将是x的深层副本。在这种情况下,您想使用auto& x2 = ...

如果T是其他内容,例如Matrix<>,则auto x2 = x.array().derived();很好,但不是auto& x2 = ...

因此,您真正想要的是一些复杂的东西:

internal::ref_selector<std::decay<decltype(x.array().derived())>::type>::non_const_type
  x2 = x.array().derived();

不好:(

一个更简单的解决方案是即使对于数组世界中已经存在的输入也不会打扰并创建ArrayWrapper

ArrayWrapper<T> x2(x.derived());

另一个简单的解决方案是强制调用方在数组世界中传递表达式:

template <typename T> void foo(ArrayBase<T> &x) {
  T& x2(x.derived());
  ...
}