c++ - 如何对 Eigen 中的二维数组的列执行简单的算术运算

标签 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 中我试图减去列的行。

我的问题是,为什么这行不通?我的(天真)理解会让我相信我可以在局部归零的二维数组和 data 数组之间执行逐元素减法,因为这些列看起来具有相同的形状(通过打印出data_collocal_col的行数和列数来检查),类型是一样的。

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

最佳答案

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

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

关于c++ - 如何对 Eigen 中的二维数组的列执行简单的算术运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49222554/

相关文章:

c++ - 错误 : no match for ‘operator=’ (operand types are ‘FILE and ‘FILE* )

javascript - 如何在 JavaScript 中仅使用数组方法来计算数组的 double 值

c++ - unique_ptr 超出结构范围

c++ - 为什么不捕获 `std::promise::~promise` 中已经传播的异常

c++ - 如何使用可变长度序列容器的内容初始化结构内部的std::array字段?

c++ - 错误 LNK2001 : unresolved external symbol - when creating abstract class c++

c++ - 为什么 std::max_element over std::map 在某些 lower_bound 中不起作用?

c++ - 为什么我不能推断出这个函数的模板参数?

arrays - 快速删除数组中的项目

java - 为什么在创建 double 组时不断收到此错误?