我用拉帕克。我正在尝试在 C 中对复杂数据进行 QR 分解。为此,我编写了函数(基于 Haatschii 代码How to get the Q from the QR factorization output?):
// Q - input: matrix that we expand / output: Q matrix
// R - output: R matrix
// rows - input: number of rows of Q
// columns - input: number of columns of Q
// rows >= columns condition is always met
void QR(lapack_complex_double * Q, lapack_complex_double * R, size_t rows, size_t columns){
size_t i;
lapack_complex_double* tau = malloc(columns*sizeof(lapack_complex_double));
LAPACKE_zgeqrf(LAPACK_ROW_MAJOR, (int) rows, (int) columns, Q, (int) columns, tau); // returns the Q, R in a packed format
// Copy the upper triangular Matrix R (columns x columns).
for(i = 0; i < columns; ++i)
memcpy(R+i*columns+i, Q+i*columns+i, (columns-i)*sizeof(lapack_complex_double));
LAPACKE_zungqr(LAPACK_ROW_MAJOR, (int) rows, (int) columns, (int) columns, Q, (int) columns, tau); // returns the Q
free(tau);
}
值得注意的是,Alireza 的作者也遇到了函数znugqr的问题,但他切换到函数zunmqr似乎幸福来了(LAPACK QR 分解)。我相信我的问题也与LAPACKE_zungqr
矩阵 R 与其他方法相同,因此LAPACKE_zgeqrf
可以成功运行。
但是最后,用 Mathematica(QRDecomposition
函数)和 Python(numpy.linalg.qr
函数)比较相似的结果(QR 分解),我看到矩阵 Q 是不同的,而矩阵 R 是相同的。
输入矩阵,为简单起见 5×5:
1 + 3j 6 + 8j 11 + 13j 16 + 18j 21 + 23j
2 + 4j 7 + 9j 12 + 14j 17 + 19j 22 + 24j
3 + 5j 8 + 10j 13 + 15j 18 + 20j 23 + 25j
4 + 6j 9 + 11j 14 + 16j 19 + 21j 24 + 26j
5 + 7j 10 + 12j 15 + 17j 20 + 22j 25 + 27j
输出 Q 矩阵(来自我的 C 代码):前 3 列:
-0.07254 - 0.21764j -0.61558 - 0.41039j 0.519770 - 0.06712j
-0.14509 - 0.29019j -0.35909 - 0.25649j -0.59817 + 0.211099j
-0.21764 - 0.36273j -0.10259 - 0.10259j 0.035755 - 0.18619j
-0.29019 - 0.43528j 0.153896 + 0.051298j -0.35605 + 0.007600j
-0.36273 - 0.50783j 0.410391 + 0.205195j 0.398709 + 0.034623j
最后两列:
-0.12316 - 0.06327j -0.11940 + 0.303152j
0.221078 + 0.491045j 0.084589 - 0.02148j
-0.06231 - 0.31146j 0.119483 - 0.80553j
-0.04594 - 0.59711j -0.01512 + 0.462905j
0.010343 + 0.480803j -0.06954 + 0.060958j
输出 Q 矩阵(来自 Python 代码):
-0.11670 - 0.06185j -0.13105 + 0.301181j
0.223111 + 0.487988j 0.096454 - 0.02009j
-0.08117 - 0.30874j 0.138515 - 0.80184j
-0.04015 - 0.59906j -0.04217 + 0.459232j
0.014923 + 0.481676j -0.06174 + 0.061519j
(这里我只列出这个矩阵的最后 2 列。前 3 列是相同的)。
我计算了这些矩阵中各列的最大和平均差异。结论是这样的:前三列在水平上10^-11
不同,后两列的差异分别是10^-3
, 10^-2
(肉眼可见的差异)。
随着矩阵大小的增加,观察到差异的增加,并且通常前 2-3 列很好地吻合。
也许有人可以帮助我?