線形代数に対処するための最良の基本型
-
23-08-2019 - |
質問
私はプロジェクト(ごめんなさい)のためのC ++が小さく、不十分な線形代数ライブラリを書いています。私は、倍精度数を使用して行列して操作を実装しています。私は右やっていますか?私の代わりに、テンプレートクラスを実装する必要がありますか?より正確なタイプの周りはありますか?
解決
私は、テンプレートを使用してC ++線形代数ライブラリを書いています。私の考えは、我々は、複素数または拡張精度の数値の日かを使用する場合がありますということでした。それは7年前に多分だった、と我々はまだそれを行っていません。私たちは、ほとんど常に、テンプレートの種類を兼ねを使用し、我々はそれを容易にするのtypedefを持っています。
のタイプを使用して、我々は他の方法を行ってきた数回、の小さいの倍以上。例えば、我々は、メモリが結合したアプリケーションで、二重のではなく、floatを説明ここで使用してきました>。しかし、時間の99.9パーセントは、我々はダブルスを使用します。
あなたがテンプレート引数を使用する場合は、、整数型を使用しますが、暗黙的に浮動小数点型を必要とするために気をつけてください。たとえば、あなたがそのエントリのすべての整数であるので、あなたは行列<整数>クラスを使用して行列を持っていると言います。しかし、その後、あなたは線形ソルバにそれを渡します。今すぐあなたの算術は、の整数の除算を使用して行われ、そして、あなたの結果が間違っています。 (私はそれをやった!)
他のヒント
私は、テンプレートを使用して、クラス/構造体を実装します。初めに、あなたが最も可能性が高いだけでdouble
に満足されるが、私はのテンプレートとして行列を実装していませんでした私はすべてのプロジェクトであることを発見した、私はそれを後で後悔します。
また、それはあなたがより興味深い要素、代数使用する機会提供します - 。区間演算、確率分布、複雑な数学、固定小数点の試合などのサブ行列、簡単な数学の:-)を、
私は小さなと不十分なを書いています 以下のためのC ++での線形代数ライブラリ プロジェクト(ごめんなさい)。
OUCH!それはだ - JAMA / TNT にチェックアウト...非常に非常に気をつけて、注意してくださいそれにNISTスタンプ-の承認を持って、彼らはすでに、「単純な」線形代数数学などのいくつかを扱ってきました様々なファクタリングアルゴリズム。線形代数、数値精度でトリッキーな問題の多くを必要とする(例えばヒルベルトの行列)とIと同じくらい私自身のことをやってのように、これはあなたがすでに十分にテストされています良い強固な基盤を使用することがありますこれらの分野の一つです。
あなたは(そのかなり確実ではない)それをダブルロング使用することができるはずですが、アルゴリズム自体はおそらく行列の精度よりも重要です。
最後の質問の答え:はい、それはlong double
と呼ばれ、少なくともdouble
ほど正確でだ、そこにあります。テンプレートを使用するかどうかについて、はい私は、テンプレートを使用します。それは彼らのために偉大なユースケースだと私はそれが簡単にいくつかの他のスカラー数値型への移植を行うことになると思います。あなたは、その後もちょうどあなたが実行され、1つは、より高速/より良いそこに働くシステムに応じて、フロートおよび/または二重の行列をtypedefをすることができます。
あなた自身のために余分な作業をしないでください。あなたは、二重(またはダブルロング)とによって得ることができればそれで行くます。
これは、ほんの少しのプロジェクトがあるように、これは、テンプレートの事はちょうどあなたのための作業を行います。その場合には、鳴ります。
議論されていない別のオプションは、あなたの要素の型を定義するためのテンプレートを使用しています。それは多くの原因となり、余分な作業があれば、しかし、後にいくつかの変更を可能にしません。
また、ハードウェアのサポートのを持っていた長い二のより正確な他のタイプはありません。しかし、あなたはより精度の必要性を感じた場合は、独自の型を作ることは自由です。しかし彼らはさえ大規模な最適化によって、ネイティブdouble型よりもかなり遅くなります。