Функция ортонормализации Лапака для прямоугольной матрицы

Мне было интересно, есть ли в Лапаке функция для ортонормирования столбцов очень высокой и тонкой матрицы. Похожий предыдущий вопрос задавал этот вопрос, предположительно, в контексте квадратной матрицы. Мои настройки таковы: у меня есть матрица M на N, столбцы которой я пытаюсь ортонормировать.

Итак, моей первой мыслью было сделать qr-разложение. Функции для выполнения qr-разложения в Лапаке, кажется, dgeqrf и dormqr. Отлично. Однако моя проблема заключается в следующем: моя матрица A настолько велика, что я не хочу на самом деле вычислять все Q, потому что это M на M. Фактически, я не могу позволить себе создать экземпляр матрицы M на M вообще ни при каких моих вычислениях (в памяти бы не поместилось). Я бы предпочел вычислить только матрицу, которую Википедия называет Q1. Тем не менее, я не могу найти способ сделать эту работу.

Странно то, что я думаю, что это возможно. Numpy, в частности, имеет функцию numpy.linalg.qr, который, кажется, делает именно это. Однако, даже прочитав их исходный код, я не могу понять, как они используют вызовы lapack, чтобы заставить это работать.

Народ есть идеи? Я бы настоятельно предпочел использовать только функции lapack, потому что я надеюсь перенести этот код в CuSOLVE, в котором реализовано несколько функций lapack (включая dgeqrf и dormqr) для графического процессора.


person Jack Hessel    schedule 06.03.2016    source источник


Ответы (1)


Вам нужна «тонкая» или «экономичная» версия QR. В Matlab вы можете сделать это с помощью:

[Q,R] = qr(A,0);

Я не использовал Lapack напрямую, но думаю, что там есть соответствующий вызов. Похоже, вы можете сделать это в python с помощью:

numpy.linalg.qr(a, mode='reduced')
person willem    schedule 07.03.2016