В вашем вопросе есть ряд вопросов.
Не используйте метод исключения Гаусса (LU-факторизация) для вычисления числового ранга матрицы. Факторизация LU для этой цели ненадежна в арифметике с плавающей точкой. Вместо этого используйте раскрывающую ранг QR-декомпозицию (например, xGEQPX
или xGEPQY
в LAPACK, где x - это C, D, S или Z, хотя эти подпрограммы трудно отследить; см . Ответ JedBrown на связанный вопрос ), или используйте SVD (разложение по единственному значению, такое какxGESDD
или xGESVD
, где x снова является C, D, S или Z). SVD - более точный и надежный алгоритм определения числового ранга, но он требует больше операций с плавающей запятой.
Однако для решения линейной системы факторизация LU (с частичным поворотом, которая является стандартной реализацией в LAPACK) чрезвычайно надежна на практике. Существуют некоторые патологические случаи, когда LU-факторизация с частичным поворотом неустойчива (см. Лекцию 22 в Числовой линейной алгебреТрефетен и Бау для деталей). QR-факторизация - это более стабильный численный алгоритм для решения линейных систем, поэтому, вероятно, он дает вам такие точные результаты. Однако для квадратных матриц требуется больше операций с плавающей запятой, чем для факторизации LU в 2 раза (я полагаю, Джекпулсон может меня поправить). Для прямоугольных систем QR-факторизация является лучшим выбором, поскольку она даст решения методом наименьших квадратов для переопределенных линейных систем. SVD также можно использовать для решения линейных систем, но это будет дороже, чем QR-факторизация.
Яннеб прав, что numpy.linalg.svd - это обертка xGESDD
в LAPACK. Разложение по сингулярным значениям происходит в два этапа. Во-первых, матрица, подлежащая разложению, приводится к двухдиагональной форме. Алгоритм, используемый для преобразования в двуугольную форму в LAPACK, вероятно, является алгоритмом Лоусона-Хансона-Чана, и он действительно использует QR-факторизацию в одной точке. Лекция 31 в Числовой линейной алгебре Трефетена и Бау дает обзор этого процесса. Затем xGESDD
используется алгоритм «разделяй и властвуй» для вычисления сингулярных значений, а также левого и правого сингулярных векторов из двухдиагональной матрицы. Чтобы получить представление об этом шаге, вам нужно обратиться к Матричным вычислениям Голуба и Ван Лоана или Прикладной числовой линейной алгебре Джима Деммеля.
Наконец, не следует путать единичные значения с собственными значениями . Эти два набора величин не одинаковы. SVD вычисляет сингулярные значения матрицы. Числовые вычисления Клива Молера с MATLAB дают хороший обзор различий между единичными значениями и собственными значениями . В общем, не существует очевидной связи между сингулярными значениями данной матрицы и ее собственными значениями, за исключением случая нормальных матриц, где особые значения являются абсолютным значением собственных значений.
dgesdd
Лапака для настоящих SVD. Итак, ваш реальный вопрос, вероятно, «как работает Lapack dgesdd?», И это довольно неуместно для stackoverflow.