Я пытаюсь получить Q-Matrix из подпрограмм LAPACK zgeqrf
и zungqr
.
У меня есть комплексная матрица Nw-by-Nw с неортогональными векторами в ее столбцах. Это мой код на C ++. (Матрица называется vr_tr)
//QR Fact.
complex<double> TAU[Nw*Nw];
zgeqrf_(&Nw, &Nw, vr_tr, &Nw, TAU, &wkopt, &lwork, &info);
lwork = (int)wkopt.real();
work = new complex<double> [lwork];
zgeqrf_(&Nw, &Nw, vr_tr, &Nw, TAU, work, &lwork, &info);
zungqr_(&Nw, &Nw, &Nw, vr_tr, &Nw, TAU, &wkopt, &lwork, &info);
lwork = (int)wkopt.real();
work = new complex<double> [lwork];
zungqr_(&Nw, &Nw, &Nw, vr_tr, &Nw, TAU, work, &lwork, &info);
//Checking if vr_tr * vr_tr' = I
complex<double> one = 1,zer=0,res[Nw*Nw]; char Tchar = 'T', Nchar = 'N';
zgemm_( &Nchar, &Tchar, &Nw, &Nw, &Nw, &one, vr_tr, &Nw, vr_tr, &Nw, &zer, res, &Nw );
for(i=0;i<Nw;i++){
for(j=0;j<Nw;j++){
cout<<res[i*Nw+j]<<"\t";
}
cout<<"\n\n";
}
То, что я получаю после запуска этого кода, не является единичной матрицей, как предполагалось, потому что он должен вычислять QR-факторизацию из zgeqrf
и получать Q-матрицу из zungqr
, а Q-матрица должна быть ортогональной, поэтому Q*Q'=I
.
Что не так с этим кодом?