C++ 特征:动态张量

Khu*_*hue 5 c++ eigen tensorflow

我想实现一个 C++ 类,它有一个张量向量作为成员。张量的维度不是预定义的,而是根据一些输入数据取值。此外,张量的等级可以不同。像这样的东西:

std::vector< TensorXd > myTensors;
Run Code Online (Sandbox Code Playgroud)

然而,在Eigen 中TensorXd动态张量没有这种类型。

为了构建每个张量,我将读取一个std::vector<double> values表示维度n x n x ... x nr时间)张量的数据向量。像这样的东西:

Tensor<double, r> tensor = TensorMap<double, r>(values.data(), std::vector<size_t>(r, n);
myTensors.push_back(tensor);
Run Code Online (Sandbox Code Playgroud)

有可能这样做吗?

非常感谢您的帮助!

更新:

正如 Yaroslav Bulatov 指出的那样,Eigen 不支持动态排名,因此必须明确写出支持的排名。在我的代码中:

#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; }
};
Run Code Online (Sandbox Code Playgroud)

Yaroslav 还建议使用宏可以帮助消除代码重复。我不熟悉 C++ 宏,因此非常感谢任何帮助。

谢谢你的帮助!

Qua*_*ant 3

您可以查看 xtensor C++ 模板库,它支持动态和静态维度。

http://xtensor.readthedocs.io/en/latest/

xtensor有一个和numpy非常相似的API,包括矢量化、广播、通用函数。这里有一个 numpy 到 xtensor 备忘单:http://xtensor.readthedocs.io/en/latest/numpy.html

最后,您可以通过单击https://github.com/QuantStack/xtensor/顶部的活页夹徽章在 C++ Jupyter 笔记本中进行实时尝试。

xtensor 还附带了科学计算主要语言(R、Julia、Python)的绑定。