スパースユニタリ行列に最適な C++ 行列ライブラリ
-
19-09-2019 - |
質問
私は、優れた (最善の場合は積極的に保守されている) C++ マトリックス ライブラリを探しています。数値型として有理数の複合体を使用したいので、これをテンプレート化する必要があります。私が扱っている行列は主にスパースでユニタリです。
ライブラリを提案し、それを使用する理由も簡単に説明していただけますか。ライブラリの見つけ方は知っていますが、ライブラリの使用経験が不足しているため、何が自分に適しているのかを実際に判断することができません。
編集:
私が担当している主な業務は、 行列の乗算, ベクトルを使ったスカラー乗算 そして クロネッカー積. 。行列のサイズは指数関数的であるため、少なくとも 1024x1024 エントリまでの行列を処理できるようにしたいと考えています。
解決
「本格的な」マトリックスの仕事をしている多くの人は、 BLAS, 、追加 ラパック / アトラス (正規行列) または UMFPACK (疎行列) より高度な数学用。その理由は、このコードが十分にテストされており、安定していて信頼性が高く、非常に高速であるためです。さらに、ベンダーから直接購入することもできます (例: インテル MKL)あなたのアーキテクチャに合わせて調整されていますが、無料で入手することもできます。 ユーブラス で述べた マヌエルの答え おそらく標準の C++ BLAS 実装です。後で LAPACK のようなものが必要になった場合は、次のものがあります。 バインディング そうするために。
ただし、これらの標準ライブラリ (BLAS / LAPACK / ATLAS または uBLAS + バインディング + LAPACK / ATLAS) のいずれも、テンプレート化されていて使いやすいという点にチェックを入れることはできません (uBLAS だけが必要な場合を除く)。実際のところ、私は BLAS / LAPACK 実装を使用するときに C / Fortran インターフェイスを直接呼び出す傾向があることを認めざるを得ません。これは、uBLAS とバインディングの組み合わせには追加の利点があまり見られないことが多いためです。
使いやすい汎用 C++ 行列ライブラリが必要な場合、私はよく使用します。 エイゲン (私が使っていたのは ニューマット 過去に)。利点:
- Intel アーキテクチャでは非常に高速で、おそらく小さな行列では最も高速です。
- 素敵なインターフェース
- マトリックス ライブラリに期待されるほぼすべての機能
- 簡単に追加できます 新しいタイプ
短所 (IMO):
- シングルプロセッサ [編集: 部分的に修正されました エイゲン 3.0]
- 大きな行列や一部の高度な数学の場合、ATLAS やインテル MKL よりも遅くなります (例:LU 分解) [編集: また、Eigen 3.0 では改善されました]
- スパース行列の実験的なサポートのみ [編集: 今後のバージョン 3.1 で改善されます]。
編集: 今後の Eigen 3.1 では、一部の関数でインテル MKL (またはその他の BLAS / LAPACK 実装) を使用できるようになります。
他のヒント
ブーストuBLASは、にそれはブーストフィルタを通過しているため。
があり、スパース行列をサポートするいくつかのテンプレートLIBSがあるので、それはあなたがあなたのニーズについて、より具体的ないないのであれば、より良い根拠を考え出すことは本当に難しいます。