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 │
                           └                   ┘

U1U2V1V2 分別是維度為 (p,p)(m-p,m-p)(q,q)(m-q,m-q) 的方陣正交/么正矩陣,而 CS(r, r) 非負對角矩陣,滿足 C^2 + S^2 = I,其中 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, iterable

要分解的複數么正或實數正交矩陣,或當省略 pq 時,可迭代的子區塊 X11X12X21X22 的 iterable。

pint, optional

左上區塊 X11 的列數,僅在 X 以陣列形式給定時使用。

qint, optional

左上區塊 X11 的行數,僅在 X 以陣列形式給定時使用。

separatebool, optional

如果為 True,則返回底層組件,而不是矩陣因子,即 (u1,u2)theta(v1h,v2h),而不是 ucsvh

swap_signbool, optional

如果為 True,則 -S-I 區塊將位於左下角,否則(預設情況下)它們將位於右上角。

compute_ubool, optional

如果為 False,則不會計算 u,並返回一個空陣列。

compute_vhbool, optional

如果為 False,則不會計算 vh,並返回一個空陣列。

返回:
undarray

compute_u=True 時,包含由區塊 U1 (p x p) 和 U2 (m-p x m-p) 正交/么正矩陣組成的區塊對角正交/么正矩陣。如果 separate=True,則包含 (U1, U2) 的元組。

csndarray
具有上述結構的正餘弦因子。

如果 separate=True,則包含 theta 陣列,其中包含弧度角。

vhndarray

compute_vh=True 時,包含由區塊 V1H (q x q) 和 V2H (m-q x m-q) 正交/么正矩陣組成的區塊對角正交/么正矩陣。如果 separate=True,則包含 (V1H, V2H) 的元組。

參考文獻

[1]

Brian D. Sutton. Computing the complete CS decomposition. Numer. Algorithms, 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