c++ - DenseBase、auto 和二进制操作表示数组具有不同的形状

标签 c++ eigen eigen3

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

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

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

但是 auto 会导致奇怪的错误。 Eigen 提示 x2y2 没有相同的形状。

如果我不想多次写.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在这里是不可取的。这就是为什么。假设你有:

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

如果T是一个 Array<>然后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());
  ...
}

关于c++ - DenseBase、auto 和二进制操作表示数组具有不同的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53324127/

相关文章:

c++ - i2c 错误 : ‘i2c_smbus_read_byte_data’ was not declared in this scope

c++ - 用 C 语言编写我的 C++ 代码

c++ - 在 Eigen 中使用 CwiseBinaryOp 时如何摆脱 "invalid use of incomplete type"

c++ - C++使用位OR运算符枚举

c++ - 如何编写以特征张量为参数的通用模板函数?

c++ - 如何正确地从nalgebra::Matrix转换为Eigen::MatrixXf?

c++ - 将 Eigen 类型与 STL 容器和 std::vector 一起使用

c++ - Eigen3:提取列数非恒定的子矩阵

c++ - 从 Eigen 旋转和平移矩阵创建 Sophus::SE3 对象并返回

c++ - 素数程序(C++)中的错误