scipy.linalg.

cossin#

scipy.linalg.cossin(X, p=None, q=None, separate=False, swap_sign=False, compute_u=True, compute_vh=True)[源代码][源代码]#

计算正交/酉矩阵的余弦-正弦(CS)分解。

X 是一个 (m, m) 的正交/酉矩阵,分割如下,其中左上块的形状为 (p, q):

                           ┌                   ┐
                           │ I  0  0 │ 0  0  0 │
┌           ┐   ┌         ┐│ 0  C  0 │ 0 -S  0 │┌         ┐*
│ X11 │ X12 │   │ U1 │    ││ 0  0  0 │ 0  0 -I ││ V1 │    │
│ ────┼──── │ = │────┼────││─────────┼─────────││────┼────│
│ X21 │ X22 │   │    │ U2 ││ 0  0  0 │ I  0  0 ││    │ V2 │
└           ┘   └         ┘│ 0  S  0 │ 0  C  0 │└         ┘
                           │ 0  0  I │ 0  0  0 │
                           └                   ┘

U1, U2, V1, V2 分别是维度为 (p,p), (m-p,m-p), (q,q), 和 (m-q,m-q) 的正交/酉矩阵,而 CS 是满足 C^2 + S^2 = I(r, r) 非负对角矩阵,其中 r = min(p, m-p, q, m-q)

此外,单位矩阵的秩分别为 min(p, q) - rmin(p, m - q) - rmin(m - p, q) - rmin(m - p, m - q) - r

X 可以单独提供,也可以通过块规范 p, q 或其子块在可迭代对象中提供,从中可以推导出形状。请参见下面的示例。

参数:
Xarray_like, 可迭代对象

要分解的复数酉矩阵或实数正交矩阵,或当省略 pq 时的子块 X11X12X21X22 的可迭代对象。

pint, 可选

左上角块 X11 的行数,仅当 X 作为数组给出时使用。

qint, 可选

左上角块 X11 的列数,仅当 X 作为数组给出时使用。

单独bool, 可选

如果 True ,则返回低级组件而不是矩阵因子,即 (u1,u2)theta(v1h,v2h) 而不是 ucsvh

swap_signbool, 可选

如果 True,则 -S-I 块将位于左下角,否则(默认情况下)它们将位于右上角。

compute_ubool, 可选

如果 Falseu 将不会被计算,并返回一个空数组。

compute_vhbool, 可选

如果 False,则不会计算 vh,并返回一个空数组。

返回:
undarray

compute_u=True 时,包含由块对角正交/酉矩阵组成的块对角矩阵,其中包括正交/酉矩阵 U1p x p)和 U2m-p x m-p)。如果 separate=True,则包含 (U1, U2) 的元组。

csndarray
具有上述结构的余弦-正弦因子。

如果 separate=True,这将包含 theta 数组,其中包含以弧度为单位的角度。

vhndarray

compute_vh=True 时,包含由块对角正交/酉矩阵组成的块对角矩阵,其中包含块 V1Hq x q)和 V2Hm-q x m-q)正交/酉矩阵。如果 separate=True,则包含 (V1H, V2H) 的元组。

参考文献

[1]

Brian D. Sutton. 计算完整的CS分解。数值算法,50(1):33-65, 2009.

示例

>>> import numpy as np
>>> from scipy.linalg import cossin
>>> from scipy.stats import unitary_group
>>> x = unitary_group.rvs(4)
>>> u, cs, vdh = cossin(x, p=2, q=2)
>>> np.allclose(x, u @ cs @ vdh)
True

同样可以通过子块输入,无需使用 pq。此外,让我们跳过 u 的计算。

>>> ue, cs, vdh = cossin((x[:2, :2], x[:2, 2:], x[2:, :2], x[2:, 2:]),
...                      compute_u=False)
>>> print(ue)
[]
>>> np.allclose(x, u @ cs @ vdh)
True