NumPyのような配列を持つC++(またはC)ライブラリは、スライス、ベクトル化された操作、コンテンツの要素ごとの加算や減算などをサポートしていますか?
ニーズに合った無料ソフトウェアをいくつか紹介します。
GNU Scientific Library はCで書かれたGPLソフトウェアです。したがって、Cに似た割り当てとプログラミングの方法(ポインターなど)があります。 GSLwrap を使用すると、GSLを使用したままC++でプログラミングできます。 GSLには [〜#〜] blas [〜#〜] 実装がありますが、デフォルトのCBLASの代わりに [〜#〜] atlas [〜#〜] を使用できます、さらにパフォーマンスが必要な場合。
boost/uBLAS ライブラリはC++で記述され、ブーストパッケージとして配布されるBSLライブラリです。これは、BLAS標準を実装するC++の方法です。 uBLASにはいくつかの線形代数関数が付属しており、 ATLASへの実験的結合 があります。
eigen はC++で書かれた線形代数ライブラリで、LGPL3(またはGPL2)の下で配布されます。 C++のプログラミング方法ですが、他の2つよりも統合されています(より多くのアルゴリズムとデータ構造が利用可能です)。固有 高速であると主張 上記のBLAS実装よりも、事実上の標準BLAS APIに準拠していません。 Eigenは、並列実装に多くの努力を払っていないようです。
Armadillo はC++用のLGPL3ライブラリです。 [〜#〜] lapack [〜#〜] (numpyが使用するライブラリ)のバインディングがあります。再帰的なテンプレートとテンプレートのメタプログラミングを使用していますが、これは良い点です(他のライブラリもそれを行っているかどうかわかりませんか?)。
xtensor は、BSDライセンスのC++ライブラリです。 NumPyと非常によく似たC++ APIを提供します。チートシートについては、 https://xtensor.readthedocs.io/en/latest/numpy.html を参照してください。
データ構造と基本的な線形代数を取得したいだけの場合、これらの選択肢は本当に良いです。スタイル、ライセンス、またはシステム管理者の課題に対する好みに応じて(LAPACKのような大きなライブラリのインストールは難しい場合があります)、ニーズに最適なライブラリを選択できます。
xtensor を試してください。 ( NumPy to Xtensor Cheat Sheet を参照してください)。
xtensorは、多次元配列式による数値解析を目的としたC++ライブラリです。
xtensorが提供する
例
2-D配列を初期化し、その行の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次元配列を初期化し、インプレースで再整形します
#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}}
DyND は、特にC++用のNumPyライクなライブラリになるように設計されています。ブロードキャスト、算術演算子、スライスなどはすべて正常に機能します。一方、まだvery実験的であり、多くの機能はまだ実装されていません。
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開発者の一人です。
Eigenは優れた線形代数ライブラリです。
http://eigen.tuxfamily.org/index.php?title=Main_Page
ヘッダーのみのライブラリであるため、インストールは非常に簡単です。最適化されたコードを生成するために、テンプレートに依存しています。行列演算を自動的にベクトル化します。
また、たとえば2つのマトリックス間の「要素ごとの乗算」などの係数ごとの演算も完全にサポートしています。それはあなたが必要なものですか?
Blitz ++ は、任意の数の軸を持つ配列をサポートしますが、Armadilloは最大3つ(ベクトル、行列、キューブ)しかサポートしません。 Eigenはベクトルとマトリックスのみをサポートします(キューブはサポートしません)。欠点は、Blitz ++には基本的なエントリ単位の操作とテンソル縮約を超える線形代数関数がないことです。かなり前に開発が遅くなったように見えますが、おそらくそれは、ライブラリがそれを行うためであり、多くの変更を加える必要がないからでしょう。
VIGRAには、優れたN次元配列の実装が含まれています。
http://ukoethe.github.io/vigra/doc/vigra/Tutorial.html
私はそれを広範に使用していますが、非常にシンプルで効果的です。また、ヘッダーのみであるため、開発環境に簡単に統合できます。 APIの観点からNumPyを使用するのに最も近いものです。
主な欠点は、他のツールほど広く使用されていないことです。そのため、オンラインではあまりヘルプが見つかりません。それ、そして、それは厄介な名前です(検索してみてください!)
Eigen は線形代数(行列、ベクトル…)のテンプレートライブラリです。これはヘッダーのみで、自由に使用できます(LGPL)。
[〜#〜] gsl [〜#〜] は素晴らしく、あなたが求めていることすべてを実行します。ただし、GPLでライセンスされています。