代码之家  ›  专栏  ›  技术社区  ›  R zu

densebase、auto和binary操作表示数组的形状不同

  •  1
  • R zu  · 技术社区  · 6 年前

    我写了一个函数,需要两个 DenseBase 作为争论。

    函数使用 .derived().array() 转换二者 Array Matrix 数组 .

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

    但是 auto 导致奇怪的错误。Eigen抱怨说 x2 y2 形状不同。

    如果我不想写 .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 回复  |  直到 6 年前
        1
  •  2
  •   ggael    6 年前

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

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

    如果 T 是一个 Array<> 然后 x.array().derived() 是一个 数组& lt;gt; x2 将是 x . 在这种情况下,您希望使用 auto& x2 = ... .

    如果 T 是不是有别的东西,例如 Matrix<> ,然后 auto x2=x.array().derived(); 很好,但不是 自动&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());
      ...
    }