Функция ортонормирования Лапака для прямоугольной матрицы
Мне было интересно, есть ли в Лапаке функция для ортонормирования столбцов очень высокой и тощей матрицы. Аналогичный предыдущий вопрос задавал этот вопрос, предположительно в контексте квадратной матрицы. Моя настройка следующая: у меня есть матрица M на N, которую я пытаюсь ортонормировать в столбцах.
Итак, моей первой мыслью было сделать разложение qr. Функции для выполнения qr-разложения в Лапаке выглядят как dgeqrf и dormqr. Отлично. Тем не менее, моя проблема заключается в следующем: моя матрица A настолько высока, что я не хочу на самом деле вычислять все Q, потому что это M по M. На самом деле, я не могу позволить создать экземпляр матрицы M по M вообще во время любого из моих вычислений (это не помещалось бы в памяти). Я бы предпочел вычислить только матрицу, которую википедия называет Q1. Тем не менее, я не могу найти способ сделать эту работу.
Странно то, что я думаю, что это возможно. В частности, Numpy имеет функцию numpy.linalg.qr, которая, по-видимому, и делает это. Однако даже после прочтения их исходного кода я не могу понять, как они используют вызовы lapack, чтобы заставить это работать.
У людей есть идеи? Я бы настоятельно предпочел использовать только функции lapack, потому что я надеюсь перенести этот код в CuSOLVE, в котором реализовано несколько функций lapack (включая dgeqrf и dormqr) для графического процессора.
1 ответ
Вы хотите "тонкий" или "экономичный" вариант QR. В Matlab вы можете сделать это с:
[Q,R] = qr(A,0);
Я не использовал Lapack напрямую, но я бы предположил, что там есть соответствующий звонок. Похоже, что вы можете сделать это в Python с:
numpy.linalg.qr(a, mode='reduced')