Avoiding array allocations is good for performance. However, I have yet to understand what is the most possible efficient way one can perform a QR decomposition of a matrix A
. (note: both Q and R matrices are needed)
Simply using
Q, R = qr(A)
is probably not the best idea, since it allocates both Q and R, where both could be re-allocated.
The function qrfact
allows one to store factorization in a packed format. However, I would still write afterwards:
F = qrfact(A); Q = F[:Q]; R = F[:R]
once again allocating new arrays for Q
and R
. Finally, the documentation also suggests the qrfact!
function, which saves space by overwriting the input A, instead of creating a copy. However, if one uses F = qrfact!(A)
the over-written A
is not useful in the sense that it is not either Q
or R
, which one (specifically, I) would need.
So my two questions are:
What is the best/most efficient way to perform a QR decomposition if you only care about the matrices
Q
andR
and you have no problem re-allocating them.What is actually written in the matrix
A
when one callsqrfact!(A)
?
Q = F[:Q]; R = F[:R]
afterwards? Can't you just useF[:Q]
as it is? – EnmeshQ
orF[:Q]
. The issue is how to avoid the allocation done fromF[:Q]
(if any is done). – CloningerF[:Q]
matrix because I need to change sign on some of the columns (qr-decomposition to find lyapunov exponents) – Cloninger