полярный#
- 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]])