我想实现一个C++类,它有张量向量作为成员。张量的尺寸不是预定义的,但会根据某些输入数据获取值。而且,张量的等级可能不同。事情是这样的:C++本征:动态张量
std::vector<TensorXd> myTensors;
在Eigen,但是,有没有这样的TensorXd
型动态张量。
对于构造每个张量,我将读取一个表示张量n x n x ... x n
(r
次)张量的向量数据std::vector<double> values
。类似这样的:
Tensor<double, r> tensor = TensorMap<double, r>(values.data(), std::vector<size_t>(r, n);
myTensors.push_back(tensor);
有没有可能这样做?
非常感谢您的帮助!
更新:
由于雅罗斯拉夫Bulatov指出,征不支持动态排名,因此支持的行列中必须明确写出。在我的代码中:
#include <iostream>
#include <vector>
#include <Eigen/Dense>
#include <unsupported/Eigen/CXX11/Tensor>
typedef Eigen::Tensor< double , 3 > Tensor3d;
typedef Eigen::Tensor< double , 4 > Tensor4d;
typedef Eigen::Tensor< double , 5 > Tensor5d;
typedef Eigen::Tensor< double , 6 > Tensor6d;
typedef Eigen::Tensor< double , 7 > Tensor7d;
typedef Eigen::Tensor< double , 8 > Tensor8d;
typedef Eigen::Tensor< double , 9 > Tensor9d;
typedef Eigen::Tensor< double , 10 > Tensor10d;
class MyClass
{
private:
Eigen::MatrixXd Potentials_1;
std::vector<Eigen::MatrixXd> Potentials_2;
std::vector<Tensor3d> Potentials_3;
std::vector<Tensor4d> Potentials_4;
std::vector<Tensor5d> Potentials_5;
std::vector<Tensor6d> Potentials_6;
std::vector<Tensor7d> Potentials_7;
std::vector<Tensor8d> Potentials_8;
std::vector<Tensor9d> Potentials_9;
std::vector<Tensor10d> Potentials_10;
public:
MyClass();
void setPotentials_1(const Eigen::MatrixXd &_Potentials_1){ Potentials_1 = _Potentials_1; }
void setPotentials_2(const std::vector<Eigen::MatrixXd> &_Potentials_2){ Potentials_2 = _Potentials_2; }
void setPotentials_3(const std::vector<Tensor3d> &_Potentials_3){ Potentials_3 = _Potentials_3; }
void setPotentials_4(const std::vector<Tensor4d> &_Potentials_4){ Potentials_4 = _Potentials_4; }
void setPotentials_5(const std::vector<Tensor5d> &_Potentials_5){ Potentials_5 = _Potentials_5; }
void setPotentials_6(const std::vector<Tensor6d> &_Potentials_6){ Potentials_6 = _Potentials_6; }
void setPotentials_7(const std::vector<Tensor7d> &_Potentials_7){ Potentials_7 = _Potentials_7; }
void setPotentials_8(const std::vector<Tensor8d> &_Potentials_8){ Potentials_8 = _Potentials_8; }
void setPotentials_9(const std::vector<Tensor9d> &_Potentials_9){ Potentials_9 = _Potentials_9; }
void setPotentials_10(const std::vector<Tensor10d> &_Potentials_10){ Potentials_10 = _Potentials_10; }
};
Yaroslav还建议使用宏可以帮助消除代码重复。我不熟悉C++宏,因此任何帮助将非常感激。
感谢您的帮助!
Eigen不支持动态排名,因此每个支持的排名必须明确写出,使用宏来保存代码重复。请参阅https://github.com/tensorflow/tensorflow/commit/eaf96c45获取支持几个额外的职位的示例 –
@YaroslavBulatov谢谢。我不熟悉C++宏。您能否阅读更新并告诉我如何在我的情况下使用宏?非常感谢你! – Khue