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.
Примеры
>>> 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]])