Matlab [Q、R、E] = qr(A)の背後にある対応するLAPACK関数は何ですか?


12

現在、行列適切なランク推定を安価に計算しようとしています。したがって、以下を使用してQR分解をピボット化するコラムレットを計算しますA

[Q,R,E]=qr(A)

Matlabで。を使用してのランクを推定しますA

tol = size(A,n)*eps*norm(A,'fro'); 
r = sum(abs(diag(R))>tol)

これは正常に機能し、Rのすべての対角要素に対するプロットは次のようになります。 plot(sort(abs(diag(R))、1、 'descend')、 'r *')

R

入力行列は、両方の実験でまったく同じです。

私の質問は、Matlabからの列ピボットQR分解がどのLAPACK関数に依存しているかということです。

助けてくれてありがとう、グリス

編集: DGEQPFは同じ間違った結果を与えます。

編集2:

  • AE+sign(E,F)
  • A
  • R
  • LAPACK 3.4.0とOpenBlas / GotoBLAS(64ビット)を使用しました
  • Matlab 7、2007b、2010b Linux 32ビット

編集3:-GDBを使用して、Matlab 2010bはDGEQP3を呼び出すことがわかりました:/usr/ubuntu10.04/matlabr2010b/bin/glnx86 /../../ bin / glnx86 /../からのdgeqp3_()の#3 0xaa46ce2f。 ...


ここで共有できる小さなマトリックスで同じ動作を引き起こすことはできますか?
GertVdE

A

A

グリス-あなたのマトリックスを見てみたい。ただし、リンクwww-e.uni-magdeburg.de/makoehle/A.mtx.gzはアクティブではありません(とにかく現時点では)。マトリックスへの現在のリンクはありますか?ありがとう、レフォスター

@LeslieFoster-scicompへようこそ!
アロンアーマディア

回答:


7

ここには2つの問題があります。

  • A
  • MATLABの内部ライブラリと同じソフトウェアスタックを持っていますか?

密か疎か?

ADGEQP3[Q,R,E] = qr(A)A

MATLABの内部ライブラリと同じソフトウェアスタックを持っていますか?

おそらく違います。これは、異なる結果が得られる1つの理由かもしれません。

QR分解を使用して記述しているライブラリを単体テストするときに、この問題に遭遇しました。MATLABを使用して作業のプロトタイプを作成しましたが、LAPACKやNumPyを使用した場合とは異なる結果が得られました。私が知る限り、MathWorksはこの情報を簡単に見つけられないため、MATLABはバージョン3.1.1以前のLAPACKバージョンとIntelのMKL BLASライブラリ(Windows、Intel Mac、およびLinux用)バージョン9.1を使用します以上(こちらをご覧ください)。SuiteSparse MATLABが使用しているバージョンについては何も見つかりませんでした。オンラインで調べたり、システムのライブラリファイルを調べたりすることで、追加情報を収集できる場合があります。ソフトウェアパッケージ間で同じライブラリと比較できるように、MATLABがリンクするライブラリを変更してみてください。エリック・チューは素晴らしい記事を提供しますこれは少なくとも、MATLABのBLASライブラリを独自のライブラリに置き換える方法を示しています(もちろん、これは自己の責任において行ってください)。彼はLAPACKでも同じことができると提案しています。MATLABが使用するSuiteSparseのバージョンを独自のバージョンに置き換えることも可能です。

A=QRQR

システムBLASおよびLAPACKライ​​ブラリを使用するため、NumPyを使用してQR分解の結果のプロトタイプを作成しました。NumPyとSciPyは、MATLABのドロップイン置換ではありません。2つのライブラリを組み合わせると、MATLABの機能の一部が欠けているためですが、この特定の線形代数タスクでは、Python + NumPy + SciPy + Matplotlibがうまく機能するはずです。


Matlabと同じソフトウェアスタックを取得することは不可能だと思います。プロトタイピングに別の環境を使用することも望ましくありません。問題は、正しくはなく、CのMATLABでのコードの作品である
Grisu別名MK

@Grisu:同じソフトウェアスタックを入手することは、ライブラリでリンクしようとするのを除けば、非常に難しいと思います。私が混乱しているのは、MATLABでの結果が正しく、Cでの結果が間違っていることをどのように知るかです。これは、既知のプロパティを持つある種のテストマトリックスですか?要するに、AronAhmadiaは正しい。アーキテクチャとソフトウェアスタックを複製する以外に、不安定なアルゴリズムで同じ結果が得られることは期待できません。2年前、MATLABフォーラムで基本的に同じことを言われました。
ジェフオックスベリー

私の意見では、QRは不安定ではありません。どのQR分解が正しいかを直接確認することはできませんが、ランクとQマトリックスからプロジェクターを計算し、そこで良い結果または悪い結果が得られ、Matlabのものが良いかどうかを簡単に確認できます。しかし、私はMatlabライブラリに対してリンクしようとします。
MK別名グリス

@Grisu:良い結果と正しい結果には明確な違いがあります。私は最近、計算を間違って実装しました。それにもかかわらず、計算は間違っていて、正しい計算は私の結果をあまり印象的にしませんでした(しかし、ありがたいことに、私の結果が正しいことを示しています)。直交プロジェクターまたは斜めプロジェクターを計算しようとしていますか?(私の論文のかなりの部分が斜めのプロジェクターに関するものだからです。)
ジェフオックスベリー

1
@GeoffOxberry:FWIW、MATLABの私のバージョンに、私が呼び出すことができますinternal.matlab.language.versionPlugins.blasし、internal.matlab.language.versionPlugins.lapackBLASとLAPACKのバージョンを取得するには
アムロ

6

ランク表示ソフトウェアに関するレスリーフォスターのページを参照してください。ランクを明らかにするQRの失敗を分析するxGEQP3このLAPACKワーキングノートも参照してください。

デバッガーにブレークポイントを設定し、スタックを調べることにより、MATLABが使用するルーチンを見つけることができるはずです。確かに数年前に見た最後に、MATLABは共有ライブラリを使用していました。その場合、シンボル名は削除できません。そのため、呼び出しスタックに関数名が表示されます(ただし、デバッグ情報を保持しないため、引数は表示されません)。


ランク表示ソフトウェアのページは役に立ちませんでした。そこに記載されているRRQRプロシージャは、私のアイデアで最初に使用したものですが、カラムピボットアイデアよりもさらに悪い結果をもたらします。
MK別名グリス

2
@グリス-それはあなたを助けたはずです。このxGEQP3アルゴリズムは、ランクを明らかにするために完全に安全ではありません。あなたは正しい結果を得ることを保証したい場合は、次のようなSVDやより安全なQRを使用する必要がありますxGEQPXxGEQPY。不安定なアルゴリズムが異なるアーキテクチャまたは異なる実装で同じ結果を返すことを期待することはできません(MATLABはおそらく古いLAPACKを使用しています)。
アロンアフマディア

GEQP3はランクを明らかにするものではないことを知っていますが、RRQRサブルーチンよりも正確な結果が得られます。SVDの使用は、外側のアルゴリズムでは高すぎます。また、LAWN-176の作者の1人と話をしますが、彼はこのエラーはバグの対象ではないと考えています。LAPACK 3.0.0のDGEQPF / DGEQP3も同じ結果で試しました。
MK別名グリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.