如何将自定义特征张量 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));
我正在尝试创建一个 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));