Как наиболее эффективно использовать 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, который (в частности, я) будет нужен.

Итак, мои два вопроса:

  1. Какой самый лучший / самый эффективный способ выполнить QR-разложение, если вы заботитесь только о матрицах Q а также R и у вас нет проблем с их перераспределением.

  2. Что на самом деле написано в матрице 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,

Другие вопросы по тегам