numpy.linalg.qr

numpy.linalg.qr(a, mode = 'reduced')

Функция linalg.qr() выполняет QR-разложение матрицы.

Данное разложение позволяет представить матрицу A в виде произведения QR, где Q - это ортогональная (унитарная) матрица, а R - это верхнетреугольная матрица.

Параметры:
a - массив NumPy или подобный массиву объект.
Двумерный массив с формой (N, M), который может состоять как из комплексных так и вещественных чисел.
mode - {‘reduced’, ‘complete’, ‘r’, ‘raw’, ‘full’, ‘economic’} (необязательный параметр).

Позволяет задать размер возвращаемых матриц Q и R. Если L = min(N, M), то возможны следующие варианты:

  • ‘reduced’ - возвращает Q и R с размерами (M, L), (L, N) (установлен по умолчанию);
  • ‘complete’ - возвращает Q и R с размерами (M, M), (M, N);
  • ‘r’ - возвращает только R с формой (L, N);
  • ‘raw’ - возвращает h, tau с размерами (N, M), (L,);
  • ‘full’ - псевдоним ‘reduced’ (присутствует для обратной совместимости);
  • ‘economic’ - возвращает h из raw (считается устаревшим).
Возвращает:
результат - кортеж из двух массивов NumPy
Первый массив в кортеже - это массив Q, второй - массив R. В режиме ‘raw’ возвращается кортеж из массивов h, tau; h содержит отражения Хаусхолдера, которые используются для генерации массивов Q и R, а массив tau содержит коофициенты масштабирования для отражений. В режиме ‘economic’ возвращается только h.

Замечание

В случае невозможности разложения указанного массива, возникает исключение LinAlgError.

Смотрите так же:
cholesky, svd

Примеры

>>> import numpy as np
>>> 
>>> A = [[12, -51,  4],
...      [6, 167, -68],
...      [-4, 24, -41]]
>>> 
>>> Q, R = np.linalg.qr(A)
>>> 
>>> Q
array([[-0.85714286,  0.39428571,  0.33142857],
       [-0.42857143, -0.90285714, -0.03428571],
       [ 0.28571429, -0.17142857,  0.94285714]])
>>> 
>>> np.dot(Q.T, Q)
array([[ 1.00000000e+00, -2.08166817e-17, -5.55111512e-17],
       [-2.08166817e-17,  1.00000000e+00,  2.77555756e-17],
       [-5.55111512e-17,  2.77555756e-17,  1.00000000e+00]])
>>> 
>>> R
array([[ -14.,  -21.,   14.],
       [   0., -175.,   70.],
       [   0.,    0.,  -35.]])
>>> 
>>> np.dot(Q.T, A)
array([[-1.40000000e+01, -2.10000000e+01,  1.40000000e+01],
       [ 5.55111512e-16, -1.75000000e+02,  7.00000000e+01],
       [ 8.88178420e-16,  0.00000000e+00, -3.50000000e+01]])
>>> 
>>> np.dot(Q, R)
array([[ 12., -51.,   4.],
       [  6., 167., -68.],
       [ -4.,  24., -41.]])
>>> 
>>> 
>>> np.linalg.qr(A, mode = 'raw')
(array([[-1.40000000e+01,  2.30769231e-01, -1.53846154e-01],
       [-2.10000000e+01, -1.75000000e+02,  5.55555556e-02],
       [ 1.40000000e+01,  7.00000000e+01, -3.50000000e+01]]),
 array([1.85714286, 1.99384615, 0.        ]))
>>> 
>>> 
>>> np.linalg.qr(A, mode = 'economic')
array([[-1.40000000e+01, -2.10000000e+01,  1.40000000e+01],
       [ 2.30769231e-01, -1.75000000e+02,  7.00000000e+01],
       [-1.53846154e-01,  5.55555556e-02, -3.50000000e+01]])