繁体   English   中英

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

[英]DenseBase, auto, and binary operation says arrays have different shape

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

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

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

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

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

Eigen来自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.

您可以通过auto x2 = x.array().derived();来解决运行时问题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());
  ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM