Как наиболее эффективно использовать QR-разложение в Юлии?
Избегание выделения массива хорошо для производительности. Тем не менее, мне еще предстоит понять, как наиболее эффективно можно выполнить QR-разложение матрицы A
, (примечание: необходимы матрицы Q и R)
Просто используя
Q, R = qr(A)
это, вероятно, не лучшая идея, поскольку она выделяет Q и R, где оба могут быть перераспределены.
Функция qrfact
позволяет хранить факторизацию в упакованном формате. Тем не менее, я все равно написал бы потом:
F = qrfact(A); Q = F[:Q]; R = F[:R]
еще раз выделяя новые массивы для Q
а также R
, Наконец, документация также предлагает qrfact!
функция, которая экономит место путем перезаписи ввода A вместо создания копии. Тем не менее, если кто-то использует F = qrfact!(A)
переписанный A
бесполезен в том смысле, что это не так Q
или же R
, который (в частности, я) будет нужен.
Итак, мои два вопроса:
Какой самый лучший / самый эффективный способ выполнить QR-разложение, если вы заботитесь только о матрицах
Q
а такжеR
и у вас нет проблем с их перераспределением.Что на самом деле написано в матрице
A
когда один звонитqrfact!(A)
?
1 ответ
В
F = qrfact!(A)
или же
F = qrfact(A)
F[:Q]
а также F[:R]
не выделяйте новые плотные массивы; они просто взгляды на упакованный формат, из которого Q
а также R
легко вычисляются. Это означает, что qrfact!(A)
не нужно выделять массивы для Q
а также R
, он просто вычисляет упакованный формат на месте для A
,
Однако это также означает, что F[:Q]
а также F[:R]
не может быть мутирован. Если вам нужно изменить один из них по какой-либо причине, вам нужно будет collect
это в изменчивый Array
и это обязательно выделит. Это все еще будет более эффективно использовать qrfact!(A)
вместо qrfact(A)
потому что последний будет выделять место для упакованной QR-факторизации, а также для collect
издание Array
,