1. ホーム
  2. c++

[解決済み】最も広く使われているC++ベクトル/行列数学/線形代数ライブラリと、そのコストと利益のトレードオフは何ですか?[クローズド]。

2022-04-20 01:02:59

質問

多くのプロジェクトが行列計算の必要性に迫られ、まずベクトルクラスを作り、徐々に機能を追加していくうちに、中途半端なカスタム線形代数ライブラリを作り、それに依存してしまうという罠に陥っているようです。

それを避けつつ、関連するライブラリ(OpenCVやOpenSceneGraphなど)に依存しないようにしたいですね。

一般的に使用されている行列計算/線形代数ライブラリにはどのようなものがありますか?また、何らかの理由で使用を控えた方が良いライブラリはありますか?私は特に幾何学/時間のコンテキスト*(2,3,4 Dim)*でこれを使用していますが、将来的にはより高次元のデータを使用する可能性があります。

どれに関しても違いを探しています。API、速度、メモリ使用量、広さ/完全性、狭さ/特異性、拡張性、および/または成熟度/安定性のいずれかに関する違いを探しています。

更新情報

結局、Eigen3を使っていますが、非常に満足しています。

解決方法は?

に落ち着いているプロジェクトが結構あります。 汎用グラフィックツールキット を使用します。 GMTLは非常に小さく、非常に機能的で、広く使われているので信頼性も高いです。 OpenSG、VRJuggler、およびその他のプロジェクトはすべて、独自の手作業による頂点/行列計算の代わりに、これを使用するように切り替えました。

すべてテンプレートで行うので、とても柔軟で、とても速いんです。


編集する

コメントでの議論と編集の後、私は特定の実装の利点と欠点について、また、あなたの状況に応じてどちらかを選択する理由について、もう少し情報を投じようと思いました。

GMTL -

メリット グラフィックエンジンのために特別に設計されたシンプルなAPI。 他のパッケージにはない、レンダリングに特化した多くのプリミティブタイプ(平面、AABB、多重補間による四面体など)が含まれている。 メモリのオーバーヘッドが非常に少なく、非常に高速で、使いやすい。

デメリット APIはレンダリングとグラフィックスに特化しています。 汎用的な (NxM) 行列、行列分解、解法などは、従来のグラフィックス/ジオメトリ アプリケーションの領域外であるため、含まれていません。

固有値 -

メリット クリーンなAPI は、かなり使いやすい。 を含む。 ジオメトリモジュール 四元数および幾何学変換を含む。 低メモリーオーバーヘッド。 フルです。 ハイパフォーマンス 大きな NxN 行列やその他の汎用数学ルーチンを解くことができます。

デメリット あなたが望んでいるよりも少し範囲が広いかもしれません(?) GMTLと比較すると、幾何学/レンダリングに特化したルーチンが少ない(例:オイラー角の定義など)。

IMSL -

メリット 非常に完全な数値計算ライブラリ。 非常に、非常に速い(最速のソルバーと思われる)。 圧倒的に大きく、完全な数学API。 商業的にサポートされ、成熟し、安定している。

デメリット コスト - 安くはない。 幾何学やレンダリングに特化したメソッドがほとんどないため、線形代数クラスの上に独自のメソッドを作成する必要があります。

NT2 -

メリット MATLABに慣れている人なら、より馴染みやすい構文を提供します。 大きな行列の完全な分解と解法を提供する等。

デメリット 数理的で、レンダリングに特化していない。 おそらくEigenほどの性能はない。

ラパック -

メリット 非常に安定した、実績のあるアルゴリズム。 長い間存在している。 完全な行列解法など。 曖昧な数学のための多くのオプション。

デメリット 性能的に劣る場合がある。 Fortranから移植されたので、使い方が変なAPIになっている。

個人的には、「これをどう使うのか」という一点に尽きると思います。 レンダリングとグラフィックスだけにフォーカスしているのであれば、私は 汎用グラフィックツールキット というのも、パフォーマンスがよく、自分で実装しなくても多くの便利なレンダリング操作をすぐにサポートしてくれるからです。 汎用的な行列解法(大きな行列のSVDやLU分解など)が必要な場合は アイゲン というのも、この製品はそれを処理し、いくつかの幾何学的な操作を提供し、大規模な行列解に対して非常に高いパフォーマンスを持っているからです。 行列やベクトルの上に)グラフィックスや幾何演算をもっと書く必要があるかもしれませんが、それはひどいことではありません。