web-dev-qa-db-fra.com

Tableaux de style NumPy pour C++?

Existe-t-il des bibliothèques C++ (ou C) dotées de tableaux de type NumPy prenant en charge le découpage, les opérations vectorisées, l’ajout et la soustraction de contenus élément par élément, etc.?

57
Llamageddon

Voici plusieurs logiciels libres qui peuvent répondre à vos besoins.

  1. La bibliothèque scientifique GNU est un logiciel sous GPL écrit en C. Il possède donc une allocation et une manière de programmer en forme de C (pointeurs, etc.). Avec GSLwrap , vous pouvez utiliser un mode de programmation C++ tout en utilisant le format GSL. GSL a une implémentation BLAS , mais vous pouvez utiliser ATLAS à la place du CBLAS par défaut, si vous voulez encore plus de performances.

  2. La bibliothèque boost/uBLAS est une bibliothèque BSL, écrite en C++ et distribuée sous forme de package boost. C++ est une façon de mettre en œuvre le standard BLAS. uBLAS est livré avec quelques fonctions d’algèbre linéaire, et il existe une liaison expérimentale à ATLAS .

  3. eigen est une bibliothèque d'algèbre linéaire écrite en C++, distribuée sous le format LGPL3 (ou GPL2). C'est une méthode de programmation C++, mais plus intégrée que les deux autres (plus d'algorithmes et de structures de données sont disponibles). Eigen affirme être plus rapide que les implémentations BLAS ci-dessus, sans suivre l'API BLAS standard de facto. Eigen ne semble pas déployer beaucoup d'efforts pour une mise en œuvre parallèle.

  4. Armadillo est la bibliothèque LGPL3 pour C++. Il a une liaison pour LAPACK (la bibliothèque utilisée par numpy). Il utilise des modèles récursifs et la méta-programmation de modèles, ce qui est un bon point (je ne sais pas si d'autres bibliothèques le font aussi?).

Ces alternatives sont vraiment bonnes si vous voulez juste obtenir des structures de données et une algèbre linéaire de base. En fonction de vos goûts en matière de style, de licences ou de défis système (l'installation de grandes bibliothèques comme LAPACK peut s'avérer difficile), vous pouvez choisir celle qui vous convient le mieux.

33
nojhan

Essayez xtensor . (Voir le NumPy to Xtensor Cheat Sheet ).

xtensor est une bibliothèque C++ destinée à l'analyse numérique avec des expressions multidimensionnelles.

xtensor fournit

  • un système d'expression extensible permettant une diffusion de type numpy.
  • une API suivant les idiomes de la bibliothèque standard C++.
  • des outils pour manipuler des expressions de tableau et utiliser xtensor.

Exemple

Initialise un tableau 2D et calcule la somme de l'une de ses lignes et d'un tableau 1D.

#include <iostream>
#include "xtensor/xarray.hpp"
#include "xtensor/xio.hpp"

xt::xarray<double> arr1
  {{1.0, 2.0, 3.0},
   {2.0, 5.0, 7.0},
   {2.0, 5.0, 7.0}};

xt::xarray<double> arr2
  {5.0, 6.0, 7.0};

xt::xarray<double> res = xt::view(arr1, 1) + arr2;

std::cout << res;

Les sorties

{7, 11, 14}

Initialiser un tableau 1-D et le remodeler à la place.

#include <iostream>
#include "xtensor/xarray.hpp"
#include "xtensor/xio.hpp"

xt::xarray<int> arr
  {1, 2, 3, 4, 5, 6, 7, 8, 9};

arr.reshape({3, 3});

std::cout << arr;

Les sorties

{{1, 2, 3},
 {4, 5, 6},
 {7, 8, 9}}
34
Quant

DyND est conçu pour être, entre autres, une bibliothèque de type NumPy pour C++. Des choses comme la radiodiffusion, les opérateurs arithmétiques et le découpage en tranches fonctionnent bien. Par contre, il est toujours très expérimental et de nombreuses fonctionnalités n'ont pas encore été implémentées.

Voici une implémentation simple de l'algorithme de Casteljau en C++ à l'aide de tableaux DyND:

#include <iostream>
#include <dynd/array.hpp>

using namespace dynd;

nd::array decasteljau(nd::array a, double t){
    size_t e = a.get_dim_size();
    for(size_t i=0; i < e-1; i++){
        a = (1.-t) * a(irange()<(e-i-1)) + t * a(0<irange());
    }
    return a;
}

int main(){
    nd::array a = {1., 2., 2., -1.};
    std::cout << decasteljau(a, .25) << std::endl;
}

J'ai écrit un article blog il y a peu de temps avec plus d'exemples et des comparaisons côte à côte de la syntaxe de Fortran 90, DyND en C++ et NumPy en Python.

Disclaimer: Je suis l'un des développeurs actuels de DyND.

7
IanH

Eigen est une bonne bibliothèque d'algèbre linéaire. 

http://eigen.tuxfamily.org/index.php?title=Main_Page

Il est assez facile à installer car c'est une bibliothèque en-tête uniquement. Il s’appuie sur template pour générer du code bien optimisé. Il vectorise automatiquement les opérations de la matrice.

Il supporte également pleinement les opérations en termes de coefficient, telles que la "multiplication par élément" entre deux matrices, par exemple. C'est ce dont tu as besoin?

3

Blitz ++ prend en charge les tableaux comportant un nombre arbitraire d'axes, alors qu'Armadillo n'en prend en charge que trois (vecteurs, matrices et cubes). Eigen ne prend en charge que les vecteurs et les matrices (pas les cubes). L'inconvénient est que Blitz ++ ne dispose pas de fonctions d'algèbre linéaire au-delà des opérations élémentaires d'entrée de gamme et des contractions tenseur. Le développement semble avoir ralenti il ​​y a un certain temps, mais c'est peut-être simplement parce que la bibliothèque fait ce qu'elle fait et que peu de changements doivent être apportés.

2
Dan Stahlke

VIGRA contient une bonne implémentation de tableau à N dimensions:

http://ukoethe.github.io/vigra/doc/vigra/Tutorial.html

Je l'utilise beaucoup, et le trouve très simple et efficace. C'est aussi un en-tête seulement, donc très facile à intégrer dans votre environnement de développement. C'est la chose la plus proche de l'utilisation de NumPy avec son API. 

Le principal inconvénient est qu'il n'est pas aussi largement utilisé que les autres, vous ne trouverez donc pas beaucoup d'aide en ligne. Ça, et c'est nommé maladroitement (essayez de le chercher!)

1
Martin

Eigen est une bibliothèque de modèles pour l’algèbre linéaire (matrices, vecteurs…). C'est un en-tête seulement et libre d'utilisation (LGPL).

0
Claudio

Le GSL est excellent. Il est cependant sous licence GPL.

0
Matt Phillips