2016-12-12 50 views
2

最近、C++での行列計算用の新しいライブラリ、LAPACKがインストールされました。私はこの分野の初心者であり、dgeqrf関数を使ってQR分解のアプリケーションをテストしたかったのです。LAPACKによるC++でのQR分解

#include <iostream> 
#include <lapacke.h> 

using namespace std; 

int main() 
{ 
    double a[4] = {0, 2, 2, -1}; 

    int m=2; 
    int n=2; 
    int info = 0; 
    int lda = m; 
    int lwork = n; 
    double *work; 
    double *tau; 

    dgeqrfp_(&m, &n, a, &lda, tau, work, &lwork, &info); 
} 

エラーなしで構築しましたが、実行しようとするとうまくいきませんでした。私が問題だかわからないが、私はdgeqrf機能の私の定義が間違っていると思う

D:\c++ code\lllll\main.cpp|15|warning: 'tau' is used uninitialized in this function [-Wuninitialized]| 
D:\c++ code\lllll\main.cpp|15|warning: 'work' is used uninitialized in this function [-Wuninitialized]| 

:私はこれらの警告メッセージを得ました。

また、dgeqrfは、voidの機能です。私はその結果(Q行列)を別の行列に保存し、それを私の計算に使用する必要があります。

誰もそれについて考えていますか?

+0

'tau'をと' work'パラメータが事前に割り当てられて配列することになっています。詳細については(特に配列の必要な長さについて)、ドキュメントを参照してください。 –

+0

@BaummitAugenしかし、ドキュメントやインターネットの「dgesqr」関数の単純なC++の例で、パラメータをどのように決定できるかについての情報は見つかりませんでした。 – Ham82

+0

申し訳ありません、申し分なく、私は偽薬を探して、私が見つけなければ答えを書くでしょう。私には分かりません。 –

答えて

2

the docsに記載されているように、TAUWORKは、関数が動作できる配列であると考えられます。

特に、WORKdoubleの配列で、少なくとも(長さ)がLWORKであり、内部の一時メモリとして使用されます。

TAUは、QR分解の基本リフレクタを出力するために使用される配列であり、長さは少なくともmin(n,m)でなければなりません。

だからあなたの完全なコールは、次のようなものになります。

#include <iostream> 
#include <lapacke.h> 
using namespace std; 
int main() 
{ 
    double a[4] = {0,2,2,-1}; 
    int m=2; 
    int n=2; 
    int info = 0; 
    int lda = m; 
    int lwork = n; 
    double work[2]; 
    double tau[2]; 
    dgeqrfp_(&m, &n, a, &lda, tau, work, &lwork, &info); 
} 
+0

ありがとうございます、今すぐ動作します。 TAUとWORKは配列であり、私の定義は間違っていました。 – Ham82

関連する問題