2017-07-31 4 views
0

J'ai le code numpy suivant:Eigen tenseur syntaxe de diffusion

# q.shape == (fxs, ks) 
# E.shape == (fxs, fxs) 
C = q[:, np.newaxis, :] * E[:, :, np.newaxis] * q[np.newaxis, :, :] 
# C.shape == (fxs, fxs, ks) 

que je Réimplémenter dans Eigen.

Voici ce que je suis venu avec:

Eigen::Tensor<T, 3> C = 
      q.reshape(Eigen::array<int, 3> {fxs, 1, ks}).broadcast(Eigen::array<int, 3> {1, fxs, 1}) 
     * E.reshape(Eigen::array<int, 3> {fxs, fxs, 1 }).broadcast(Eigen::array<int, 3> {1, 1, ks}) 
     * q.reshape(Eigen::array<int, 3> {1, fxs, ks}).broadcast(Eigen::array<int, 3> {fxs, 1, 1}); 

mais cela semble assez bavard. Est-ce la bonne traduction?

Répondre

1

Vous pouvez essayer la bibliothèque de modèles xtensor C++, qui prend en charge les dimensions dynamiques et statiques http://xtensor.readthedocs.io

xtensor a une API qui est très similaire à celle de numpy, y compris la vectorisation, la radiodiffusion, la fonction universelle. Il y a un numpy à xtensor antisèche ici: http://xtensor.readthedocs.io/en/latest/numpy.html

Enfin, vous pouvez essayer de vivre dans un ordinateur portable C++ Jupyter en cliquant sur le badge de liant au sommet de https://github.com/QuantStack/xtensor/

xtensor est également livré avec fixations pour la principale langues de calcul scientifique (R, Julia, Python).