如何将自定义特征张量 class 存储到 std::vector 中?

How to store a custom Eigen Tensor class into std::vector?

我正在尝试创建一个 std::vector (DIIS_Tensors),它包含我正在收敛的张量的几个 (DIIS_num_iters) 迭代。

我这样初始化 DIIS_Tensors:

std::vector<TensorRank4> DIIS_Tensors(DIIS_num_iters);

其中 TensorRank4 是自定义的 class,定义如下:

class TensorRank4 {
public:
  TensorRank4(size_t dim0, size_t dim1, size_t dim2, size_t dim3) {
    dims_[0] = dim0;
    dims_[1] = dim1;
    dims_[2] = dim2;
    dims_[3] = dim3;
    data_.resize(dims_[0] * dims_[1] * dims_[2] * dims_[3]);
  }
  double& operator ()(size_t i, size_t j, size_t k, size_t l) {
    return data_(index(i, j, k, l));
  }
  const double& operator ()(size_t i, size_t j, size_t k, size_t l) const {
    return data_(index(i, j, k, l));
  }


//  std::vector<double> resizeR4TensortoVector(const TensorRank4 &t_dim4, int dim0, int dim1, int dim2, int dim3){

  void setZero() { data_.setZero();}
  void clear() {
    data_.resize(0);
    std::fill(dims_, dims_ + 4, 0); // It may not be std::fill but you get the posize_t.
  }

private:
  size_t index(size_t i, size_t j, size_t k, size_t l) const {
    return i * dims_[3] * dims_[2] * dims_[1]
         + j * dims_[3] * dims_[2]
         + k * dims_[3]
         + l;
  }
  size_t dims_[4];
  Eigen::VectorXd data_;
};

但是,当我 运行 这段代码时,我得到了错误:

no matching constructor for initialization of 'TensorRank4'

根据一些搜索,这似乎与没有此 class 的默认构造函数有关,但我对如何解决此问题感到困惑。

std::vector<TensorRank4> DIIS_Tensors(DIIS_num_iters);> 正在尝试 construct DIIS_num_iters 默认插入 TensorRank4.

类型的元素

Constructs the container with count default-inserted instances of T.

但是TensorRank4没有默认构造函数,不能默认插入。

您可以为 TensorRank4 添加默认构造函数,或将实例传递给 vector 的构造函数。

Constructs the container with count copies of elements with value value.

例如

// construct DIIS_Tensors with DIIS_num_iters copies of TensorRank4(1,2,3,4)
std::vector<TensorRank4> DIIS_Tensors(DIIS_num_iters, TensorRank4(1,2,3,4));

这一行:

std::vector<TensorRank4> DIIS_Tensors(DIIS_num_iters);

正在尝试默认构造 DIIS_num_iters 数量的 TensorRank4 个对象。因此,如果您没有默认构造函数,编译器会报错。

只需将默认构造函数添加到您的 TensorRank4 class:

TensorRank4() {
      //Code if needed
  }

请注意,如果您像这样为参数化构造函数提供默认参数,您也可以拥有一个默认构造函数:

TensorRank4(size_t dim0 = val0, size_t dim1 = val1, size_t dim2 = val2, size_t dim3 = val3) {
    ...
}

或者,您可以像这样使用构造函数显式构造向量中的副本:

std::vector<TensorRank4> DIIS_Tensors(DIIS_num_iters, TensorRank4(5,5,5,5));