scipy.linalg.

polar#

scipy.linalg.polar(a, side='right')[源代码]#

计算极分解。

返回极分解的因子 [1] up,使得 a = up(如果 side 为“right”)或 a = pu(如果 side 为“left”),其中 p 为正半定的。根据 a 的形状,u 的行或列是正交归一的。当 a 为一个方阵时,u 为一个方阵酉阵。当 a 为非方阵时,计算“经典极分解” [2]

参数:
a(m, n) array_like

要分解的阵列。

side{‘left’, ‘right’}, 可选

确定计算的是右极分解还是左极分解。如果 side 为“right”,则 a = up。如果 side 为“left”,则 a = pu。默认值为“right”。

返回:
u(m, n) 行列

em class="xref py py-obj">a が正方行列である場合、em class="xref py py-obj">u がユニタリ行列になります。m > n の場合、em class="xref py py-obj">a の列が正規直交となり、m < n の場合、em class="xref py py-obj">u の行が正規直交します。

p行列

em class="xref py py-obj">p はエルミート正半定値です。em class="xref py py-obj">a が正則行列である場合、em class="xref py py-obj">p は正定値です。em class="xref py py-obj">p の形状は (n, n) または (m, m) で、em class="xref py py-obj">side がそれぞれ「right」または「left」であるかどうかに依存します。

参考文献

[1]

R. A. Horn および C. R. Johnson、「行列解析」、ケンブリッジ大学出版局、1985 年

[2]

N. J. Higham、「行列関数: 理論と計算」、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]])