2017-02-26 95 views
3

我想實現一個C++類,它有張量向量作爲成員。張量的尺寸不是預定義的,但會根據某些輸入數據獲取值。而且,張量的等級可能不同。事情是這樣的:C++本徵:動態張量

std::vector<TensorXd> myTensors; 

Eigen,但是,有沒有這樣的TensorXd型動態張量。

對於構造每個張量,我將讀取一個表示張量n x n x ... x nr次)張量的向量數據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++宏,因此任何幫助將非常感激。

感謝您的幫助!

+0

Eigen不支持動態排名,因此每個支持的排名必須明確寫出,使用宏來保存代碼重複。請參閱https://github.com/tensorflow/tensorflow/commit/eaf96c45獲取支持幾個額外的職位的示例 –

+0

@YaroslavBulatov謝謝。我不熟悉C++宏。您能否閱讀更新並告訴我如何在我的情況下使用宏?非常感謝你! – Khue

回答

1

您可以查看xtensor C++模板庫,它支持動態和靜態維度。

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

xtensor有一個API,這是非常相似numpy的,包括矢量,廣播,通用功能。還有就是xtensor小抄這裏numpy的:http://xtensor.readthedocs.io/en/latest/numpy.html

最後,你可以嘗試通過點擊粘結劑徽章在https://github.com/QuantStack/xtensor/

xtensor頂部生活在一個C++ Jupyter筆記本還配備了綁定主科學計算語言(R,Julia,Python)。

+0

謝謝。好一個!但是就性能而言,xtensor與Eigen張量相比如何?尤其是張量收縮(這是我項目中的一項關鍵操作)。 – Khue

+0

沒有一個系統的基準。 SIMD加速最近才被插入xtensor。 – Quant

+0

我檢查了文檔,看起來xtensor不支持張量收縮。更具體地說,我需要用(D-1)向量執行D維張量(的內積)(因此結果是一個向量)。有沒有可能在xtensor中有效地做到這一點?我想我應該發佈一個單獨的問題。 – Khue