スライス、ベクトル化された操作、要素ごとのコンテンツの追加と削除などをサポートする NumPy のような配列を持つ C++ (または C) ライブラリはありますか?
13 に答える
ここでは、ニーズに合ったいくつかのフリー ソフトウェアを紹介します。
GNU Scientific Libraryは、C で書かれた GPL ソフトウェアです。したがって、C に似た割り当てとプログラミング方法 (ポインターなど) を備えています。GSLwrapを使用すると、GSL を使用しながら C++ の方法でプログラミングを行うことができます。GSL にはBLAS実装がありますが、さらにパフォーマンスが必要な場合は、デフォルトの CBLAS の代わりにATLASを使用できます。
boost/uBLASライブラリはC++ で記述され、boost パッケージとして配布される BSL ライブラリです。これは、BLAS 標準を実装する C++ の方法です。uBLAS にはいくつかの線形代数関数が付属しており、ATLAS への実験的なバインドがあります。
eigenは C++ で書かれた線形代数ライブラリで、MPL2 ライセンス (バージョン 3.1.1 以降) または LGPL3/GPL2 (古いバージョン) の下で配布されます。これは C++ のプログラミング方法ですが、他の 2 つよりも統合されています (より多くのアルゴリズムとデータ構造が利用可能です)。Eigenは、上記の BLAS 実装よりも高速であると主張していますが、事実上の標準の BLAS API には従いません。Eigen は、並列実装にあまり力を入れていないようです。
Armadilloは C++ 用の LGPL3 ライブラリです。LAPACK (numpy で使用されるライブラリ) のバインディングがあります。再帰的なテンプレートとテンプレートのメタプログラミングを使用していますが、これは良い点です (他のライブラリもそうしているかどうかはわかりません)。
xtensorは、BSD ライセンスの C++ ライブラリです。NumPy と非常によく似た C++ API を提供します。チート シートについては、https://xtensor.readthedocs.io/en/latest/numpy.htmlを参照してください。
これらの代替手段は、データ構造と基本的な線形代数を取得したいだけの場合に非常に適しています。スタイル、ライセンス、またはシステム管理者の課題 (LAPACK のような大きなライブラリのインストールは難しい場合があります) についての好みに応じて、ニーズに最も適したものを選択できます。
DyNDは、特に C++ 用の NumPy ライクなライブラリになるように設計されています。ブロードキャスト、算術演算子、スライスなどはすべて正常に機能します。一方で、まだ非常に実験的であり、多くの機能がまだ実装されていません。
DyND 配列を使用した C++ での de Casteljau アルゴリズムの簡単な実装を次に示します。
#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、C++ の DyND、Python の NumPy の構文の例と比較を追加したブログ投稿を書きました。
免責事項: 私は現在の DyND 開発者の 1 人です。
Eigen は優れた線形代数ライブラリです。
http://eigen.tuxfamily.org/index.php?title=Main_Page
ヘッダーのみのライブラリであるため、インストールは非常に簡単です。十分に最適化されたコードを生成するために、テンプレートに依存しています。行列演算を自動的にベクトル化します。
また、たとえば 2 つの行列間の「要素ごとの乗算」などの係数単位の演算も完全にサポートしています。それはあなたが必要とするものですか?
Eigenは、線形代数 (行列、ベクトルなど) のテンプレート ライブラリです。ヘッダーのみで、自由に使用できます (LGPL)。
GSLは素晴らしいです。あなたが求めていることをすべて実行し、さらに多くのことを実行します。ただし、GPL の下でライセンスされています。