如何在Eigen

时间:2018-03-11 16:53:31

标签: c++ arrays c++14 eigen eigen3

我是Eigen的新手,并且我的问题有以下最小例子。

#include <iostream>
#include <Eigen/Dense>

template <typename T>
struct arr_holder
{
  explicit arr_holder(Eigen::ArrayBase<T> const &loc)
      : local_arr {decltype(local_arr)::Zero(loc.rows(), loc.cols())}
  { 
      do_calc(loc);
  }

  auto do_calc(Eigen::ArrayBase<T> const &data) -> void
  {
    auto &&data_col  = data.col(0);
    auto &&local_col = local_arr.col(0);

    std::cout << data_col - local_col << '\n';
  }

 private:
  Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic> local_arr;
};

int main() {
  Eigen::Array<double, 3, 3> data;
  data << 1.0, 2.0, 3.0, 2.0, 5.0, 7.0, 2.0, 5.0, 7.0;

  auto arr = arr_holder(data);
}

此代码无法使用Eigen 3.3.4和Clang 5.0.1编译,错误

eigen/Eigen/src/Core/AssignEvaluator.h:833:3: error: static_assert failed "YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES"
  EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(ActualDstTypeCleaned,Src)

源自do_calc中我尝试减去列的行。

我的问题是,为什么这不起作用?我(天真)的理解会让我相信我可以在局部归零的2D阵列和data阵列之间执行逐列减法,因为列看起来具有相同的形状(通过打印检查) out data_collocal_col)的行数和列数,类型相同。

我在这里误解了什么,在类拥有的2D数组和作为参数传递的2D数组之间执行这种列式操作的正确方法是什么?我怀疑是我误用Dynamic数组?

1 个答案:

答案 0 :(得分:2)

你正在减去一个double数组和一个3x3数组的数组,这是不允许的。也许你打算写:

Eigen::Array<typename T::Scalar, Eigen::Dynamic, Eigen::Dynamic> local_arr;