scipy.linalg.

cossin#

scipy.linalg.cossin(X, p=None, q=None, отдельный=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) соответственно, и C и S являются (r, r) неотрицательные диагональные матрицы, удовлетворяющие C^2 + S^2 = I где r = min(p, m-p, q, m-q).

Более того, ранг единичных матриц равен min(p, q) - r, min(p, m - q) - r, min(m - p, q) - r, и min(m - p, m - q) - r соответственно.

X может быть предоставлен либо сам по себе со спецификациями блоков p, q, либо его подблоки в итерируемом объекте, из которого будут выведены формы. См. примеры ниже.

Параметры:
Xarray_like, iterable

комплексная унитарная или вещественная ортогональная матрица для разложения, или итерируемый объект подблоков X11, X12, X21, X22, когда p, q опущены.

pint, необязательный

Количество строк верхнего левого блока X11, используется только когда X задан как массив.

qint, необязательный

Количество столбцов левого верхнего блока X11, используется только когда X задан как массив.

отдельныйbool, необязательно

if True, вместо матричных факторов возвращаются низкоуровневые компоненты, т.е. (u1,u2), theta, (v1h,v2h) вместо u, cs, vh.

swap_signbool, необязательно

if True, -S, -I блок будет в нижнем левом углу, в противном случае (по умолчанию) они будут в верхнем правом блоке.

compute_ubool, необязательно

if False, u не будет вычислен и возвращается пустой массив.

compute_vhbool, необязательно

if 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`, contains the block diagonal orthogonal/unitary matrix consisting of the blocks ``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

То же самое можно ввести через подблоки без необходимости p и q. Также пропустим вычисление 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