2012-06-23 5 views
41

スライシング、ベクトル化演算、要素ごとの内容の加算および減算などをサポートするNumPyのような配列を持つC++(またはC)ライブラリはありますか?C++のNumPyスタイルの配列?

+2

[アルマジロ(http://arma.sourceforge.net/)? –

+0

私が知っている限り、numpyは[LAPACK](http://en.wikipedia.org/wiki/LAPACK)を使用しています。これはFortranで書かれていますが、C++バインディングが利用可能です。しかし、それらのどちらも使用していません。 – Voo

+0

[ArmaNpy](https://sourceforge.net/projects/armanpy/)と呼ばれるNumPyへの最近のC++インターフェイスがあります。 – mtall

答えて

28

ここには、お客様のニーズに合わせたいくつかのフリーソフトウェアがあります。

  1. GNU Scientific Libraryしたがって、それはプログラミング(ポインタなど)のC状割り当て及び方法がCで書かれたGPLソフトウェアです。 GSLwrapでは、GSLを使用しながらC++のプログラミング方法を使用できます。 GSLにはBLASの実装がありますが、より多くのパフォーマンスが必要な場合は、デフォルトのCBLASの代わりにATLASを使用できます。

  2. boost/uBLASライブラリはC++で書かれており、ブーストパッケージとして配布、BSLライブラリです。これは、BLAS標準を実装するC++の方法です。 uBLASには線形代数関数がいくつか付属しており、experimental binding to ATLASがあります。

  3. eigenは、LGPL3(またはGPL2)で配布されているC++で書かれた線形代数ライブラリです。これはC++のプログラミング方法ですが、他の2つよりも統合されています(より多くのアルゴリズムとデータ構造が利用可能です)。 Eigen claim to be fasterは、上記のBLAS実装よりも、実質的な標準BLAS APIには従っていません。 Eigenは並列実装に多くの努力を払わないようです。

  4. Armadilloは、C++用のLGPL3ライブラリです。それはLAPACK(numpyによって使用されるライブラリ)のためのバインディングを持っています。再帰的テンプレートとテンプレートメタプログラミングを使用しています。これは良い点です(他のライブラリでもそれをやっているのかどうかわかりません)。

これらの選択肢は、データ構造と基本線形代数を取得したい場合には本当に便利です。スタイル、ライセンス、またはシステム管理の課題(LAPACKのような大きなライブラリをインストールするのは難しいかもしれません)に関するあなたの好みに応じて、あなたのニーズに最も適したものを選ぶことができます。

+0

-1スレッド内の他の人の回答をすべて取って、あなたの「答え」としてグループ分けするのはかなり不自由です。ブースト/ uBLASでちょうど答えたはずです、それは新しいものです。 –

+6

それを信じるかどうか、私の答えは私自身の検索の結果で、数ヶ月前です。私は自分の選択を助ける情報を集めることが興味深いと信じていました。私はいくつかの情報を回答に広げる方が良いとは確信していません。あなたは、効率よりも倫理に悩まされていると感じるならば、誰にでもアップヴォートすることができます。 – nojhan

+12

悲しいことに、これらのどれも、一般的で簡潔な配列として何も提供していません。ナンシー配列は任意次元で、 'a [:4、:: - 1、:、19] = b [なし、-5:、なし]'や 'a [a> 5] = 0'などのようなものをサポートします利用可能な配列および索引操作関数の膨大なセットを持つことができます。私は本当に誰かがC++のために何かを作ってくれることを願っています。 – amaurea

-5

これらのすべては、ほとんどのコンパイラ実装の一部として利用可能な標準テンプレートライブラリ(STL)を使用して可能です。あなたはSTLを見ましたか?

+5

はい、数学的な操作をすべて自分で書く準備ができている場合は、 –

+8

そして数十種類のバグをデバッグした後、おそらくそれを書いていく過程で導入すると、numpyが効率的な要素5であることがわかります。それはあなたのコードをすべて書き直して、プロセスのバグの..実際には良い考えではありません。 – Voo

3

Eigenは良い線形代数ライブラリです。

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

それはヘッダのみのライブラリですので、インストールするのはとても簡単です。最適化されたコードを生成するためにテンプレートに依存しています。行列演算を自動的にベクトル化します。

また、2つの行列間の「1要素当たりの乗算」などの係数賢明な演算も完全にサポートしています。それはあなたが必要なものですか?

+0

Eigenの構文はかなりひどいです。 Numpyで見つけた滑らかなスライシング構文はありません。そして、それは一般的なn次元配列ライブラリではなく、1次元ベクトルと2次元行列のためだけです。彼らがVector配列を1D配列用に、MatrixXdを2D配列用に持っているという事実は、すでに私に嫌われています。 – Alex

0

Eigenは、線形代数(行列、ベクトル...)のテンプレートライブラリです。ヘッダーのみで自由に使用できます(LGPL)。

0

GSLは素晴らしいです、それはあなたが尋ねていることすべてを行います。しかし、それはGPLの下でライセンスされています。

1

Blitz++は、任意の数の軸を持つ配列をサポートしますが、アルマジロは最大3つ(ベクトル、行列、および立方体)しかサポートしません。 Eigenはベクトルと行列のみをサポートします(立方体ではありません)。欠点は、Blitz ++には基本的な入力操作とテンソルの収縮を超える線形代数関数がないことです。開発はかなり前には減速したようですが、おそらくそれはライブラリが行うことを行い、多くの変更を加える必要がないからです。

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

私は広範囲にそれを使用し、それは非常にシンプルで効果的な見つける:

1

ヴィグラは良いN次元配列の実装が含まれています。ヘッダーのみであるため、開発環境に簡単に統合することもできます。それはNumPyをAPIとして使用することに私が遭遇した最も近いものです。

主な欠点は、それが他のものほど広く使われていないことです。そのため、オンラインで多くのヘルプを見つけることはできません。

-1

GLMは、OpenGLとGLSLを使って簡単にメッシュ処理できるように設計されていますが、非常に直感的なインターフェイスセットを備えたC++のフル機能のヘッダ専用数学ライブラリです。

ベクトルタイプ&のマトリックスタイプとその上でのさまざまな操作を宣言します。

2つの行列を掛けることは(M1 * M2)と同じように簡単です。 2つのベクトル(V1〜V2)を減算します。

ベクトルまたは行列に含まれる値へのアクセスも同様に簡単です。例えばvec3ベクトルを宣言した後、vector.xで最初の要素にアクセスできます。見てみな。

6

DyNDは、とりわけC++のNumPyライクなライブラリとして設計されています。放送、算術演算子、スライスなどのすべてがうまく動作します。一方、それはまだ非常にであり、まだ多くの機能が実装されていません。

ここDyNDアレイを使用してC++でのデ・カステリョのアルゴリズムの単純な実装です:

#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; 
} 

私は、Fortran 90の構文のより多くの例と並べて比較して少しバックblog postを書きました、C++でのDyND、PythonでのNumPyです。

免責事項:私は現在のDyND開発者の1人です。

15

試してみてくださいxtensor。 (NumPy to Xtensor Cheat Sheetを参照してください)。

xtensorは、多次元配列式による数値解析を目的としたC++ライブラリです。

xtensorは

  • numpyのスタイルの放送を可能にする拡張可能な発現系を提供します。
  • C++標準ライブラリのイディオムに続くAPI。
  • xtensorに基づいて配列式を操作して構築するツール。

2次元配列を初期化し、その行の1つ及び1-Dアレイの和を計算します。

#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; 

出力

{7, 11, 14} 

1-Dアレイを初期化し、インプレース、それを再構築。

#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; 

出力

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