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

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

本文关键字:std vector 存储 自定义 特征 张量类      更新时间:2023-10-16

我正在尝试创建一个 std::vector (DIIS_Tensors(,其中包含我正在收敛的张量的一些 (DIIS_num_iters( 次迭代。

我初始化了DIIS_Tensors:

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

其中 TensorRank4 是下面定义的自定义类:

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_;
};

但是,当我运行此代码时,我收到错误:

没有匹配的构造函数来初始化"TensorRank4">

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

这一行:

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

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

只需将默认 ctor 添加到您的TensorRank4类中:

TensorRank4() {
//Code if needed
}

请注意,如果您为参数化 ctor 提供默认参数,则也可以拥有默认 ctor,如下所示:

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

或者,您可以使用 ctor 显式构造向量中的副本,如下所示:

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

std::vector<TensorRank4> DIIS_Tensors(DIIS_num_iters);>正在尝试构造DIIS_num_iters默认插入的TensorRank4类型的元素。

使用计数默认插入的 T 实例构造容器。

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

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

使用值为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));