scipy.linalg.

полярный#

scipy.linalg.полярный(a, сторона='right')[источник]#

Вычислить полярное разложение.

Возвращает множители полярного разложения [1] u и p такой, что a = up (если сторона является "правым") или a = pu (если сторона является “left”), где p является положительно полуопределённой. В зависимости от формы a, либо строки, либо столбцы u ортонормированы. Когда a является квадратным массивом, u является квадратным унитарным массивом. Когда a не является квадратной, «каноническое полярное разложение» [2] вычисляется.

Документация написана в предположении, что аргументы-массивы имеют указанные «основные» формы. Однако аргументы-массивы этой функции могут иметь дополнительные «пакетные» измерения, добавленные перед основной формой. В этом случае массив обрабатывается как пакет низкоразмерных срезов; см. Пакетные линейные операции подробности.

Параметры:
a(m, n) array_like

Массив для факторизации.

сторона{‘left’, ‘right’}, необязательно

Определяет, вычисляется ли правая или левая полярная декомпозиция. Если сторона является «правым», тогда a = up. Если сторона равно “left”, тогда a = pu. По умолчанию — «right».

Возвращает:
u(m, n) ndarray

Если a является квадратной, тогда u является унитарной. Если m > n, то столбцы a ортонормированы, и если m < n, то строки u являются ортонормированными.

pndarray

p является эрмитовой положительно полуопределённой. Если a невырожденна, p является положительно определённой. Форма p имеет размер (n, n) или (m, m), в зависимости от того, сторона является "правым" или "левым", соответственно.

Ссылки

[1]

R. A. Horn и C. R. Johnson, “Matrix Analysis”, Cambridge University Press, 1985.

[2]

N. J. Higham, «Functions of Matrices: Theory and Computation», SIAM, 2008.

Примеры

>>> import numpy as np
>>> from scipy.linalg import polar
>>> a = np.array([[1, -1], [2, 4]])
>>> u, p = polar(a)
>>> u
array([[ 0.85749293, -0.51449576],
       [ 0.51449576,  0.85749293]])
>>> p
array([[ 1.88648444,  1.2004901 ],
       [ 1.2004901 ,  3.94446746]])

Пример неквадратной матрицы, где m < n:

>>> b = np.array([[0.5, 1, 2], [1.5, 3, 4]])
>>> u, p = polar(b)
>>> u
array([[-0.21196618, -0.42393237,  0.88054056],
       [ 0.39378971,  0.78757942,  0.4739708 ]])
>>> p
array([[ 0.48470147,  0.96940295,  1.15122648],
       [ 0.96940295,  1.9388059 ,  2.30245295],
       [ 1.15122648,  2.30245295,  3.65696431]])
>>> u.dot(p)   # Verify the decomposition.
array([[ 0.5,  1. ,  2. ],
       [ 1.5,  3. ,  4. ]])
>>> u.dot(u.T)   # The rows of u are orthonormal.
array([[  1.00000000e+00,  -2.07353665e-17],
       [ -2.07353665e-17,   1.00000000e+00]])

Еще один неквадратный пример, с m > n:

>>> c = b.T
>>> u, p = polar(c)
>>> u
array([[-0.21196618,  0.39378971],
       [-0.42393237,  0.78757942],
       [ 0.88054056,  0.4739708 ]])
>>> p
array([[ 1.23116567,  1.93241587],
       [ 1.93241587,  4.84930602]])
>>> u.dot(p)   # Verify the decomposition.
array([[ 0.5,  1.5],
       [ 1. ,  3. ],
       [ 2. ,  4. ]])
>>> u.T.dot(u)  # The columns of u are orthonormal.
array([[  1.00000000e+00,  -1.26363763e-16],
       [ -1.26363763e-16,   1.00000000e+00]])