2011-01-01 14 views
4

私は初心者ですがC++で初心者です。LapackppとブーストBLAS

私は自分の修士論文のためのプログラムを書いており、その一部は回帰的な方法で回帰を解決すると考えています。

私が解決したいと思います:

Ax = y 

私の場合は計算速度がそれは私がブーストかどうかを知りたい方法ですが、無視できません::

x = (A^T A)^{-1}A^Ty 

を使用してBLASは少ないが必要になります計算時間はLapackpp(私はgentooを使用しています)。

P.S. 私はLapackppプロジェクトサイトのクラス文書では例を見つけることができませんでした。誰かが私にLAPACKが速いブーストその後、ある場合には、いくつかの例:: BLAS

を提供してもらえおかげで

+0

マトリックスが密集しているか疎なのか、uBlas数値バインディングをチェックすると、多くのバインディングAFAIKが実装されています。あなたはlapackを使っているので、行列は密であると推測しています...なぜそれほど奇妙な(A^T A)^ { - 1} A^T ?? –

+0

すべての要素はゼロで、共分散メトリックは2倍(2x2)でなければなりません。数式をスタックオーバーフローに入れる方法を教えてもらえれば、私は表記法(A^TA)^ { - 1} A^T)を変更することができます。 – Eagle

+1

'(A^TA)^ { - 1} A^TはAの逆行列です。この式で計算するのではなく、ライブラリに付属のpsudo-inverse関数を使用したいと思うかもしれません。 – Alejandro

答えて

2

ハイレベルのインタフェースと低レベルの最適化は、二つの異なるものです。

LAPACKとuBLASは、高レベルのインターフェイスと最適化されていない低レベルの実装を提供します。ハードウェアに最適化された低レベルのルーチン(またはバインディング)は、別の場所から来るべきです。バインディングが提供されると、LAPACKとuBLASは最適化されていない最適化された実装ではなく、最適化された低レベルのルーチンを使用できます。

たとえば、ATLASは最適化された低レベルルーチンを提供しますが、高レベル(レベル3のBLASなど)のインターフェースは限られています。 ATLASをLAPACKにバインドすることができます。その後、LAPACKは低レベルの作業にATLASを使用します。技術的な仕事を経験豊富なエンジニア(ATLAS)に任せているシニアマネージャーとしてLAPACKを考えてみましょう。 uBLASでも同じです。 uBLASとMKLをバインドすることができます。結果は最適化されたC++ライブラリになります。ドキュメントの内容を確認し、Googleを使用してその方法を理解してください。

3

本当にC++で実装する必要はありますか?例えば、python/numpyはあなたの代わりになるでしょうか?再帰的回帰(最小二乗)の場合、MIT教授のStrangの線形代数やその本の講義を探すことをお勧めします。数値解析の観点から

4

、あなたが

  • が明示的に回帰

ための正規方程式(A^T A)の行列を行列を反転させ、または

  • フォームというコードを書きたいことはありませんこれらの両方は、同じ問題を直接解決する代替案よりも、より多くの作業とあまり正確ではありません。

    行列逆行列を示す数学が見えるときは、「線形方程式を解く」ことを意味するか、行列を因数分解して系を解くために使用する必要があります。 BLASとLapackの両方でこれを行うルーチンがあります。

    同様に、回帰については、回帰を計算するライブラリ関数を呼び出すか、それを自分で行う方法を読んでください。正規方程式法は教科書間違った方法ですそれを行うには。

  • 2

    Armadilloは素敵なC++インタフェースにBLASとLAPACKをラップし、直接あなたの問題に関連し、以下のMatlabライクな機能を提供します。

    • solve()、線形方程式
    • pinv()のシステムを解決するために、擬似-inverse(内部でSVDを使用する)