scipy.linalg.

subspace_angles#

scipy.linalg.subspace_angles(A, B)[источник]#

Вычислить углы между подпространствами двух матриц.

Документация написана в предположении, что аргументы-массивы имеют указанные «основные» формы. Однако аргументы-массивы этой функции могут иметь дополнительные «пакетные» измерения, добавленные перед основной формой. В этом случае массив обрабатывается как пакет низкоразмерных срезов; см. Пакетные линейные операции подробности.

Параметры:
A(M, N) array_like

Первый входной массив.

B(M, K) array_like

Второй входной массив.

Возвращает:
углыndarray, форма (min(N, K),)

Углы между подпространствами, образованными столбцовыми пространствами A и B в порядке убывания.

Смотрите также

orth
svd

Примечания

Это вычисляет углы подпространств согласно формуле, предоставленной в [1]. Для эквивалентности с поведением MATLAB и Octave используйте angles[0].

Добавлено в версии 1.0.

Ссылки

[1]

Князев А., Аргенти М. (2002) Главные углы между подпространствами в A-скалярном произведении: алгоритмы и оценки возмущений. SIAM J. Sci. Comput. 23:2008-2040.

Примеры

Матрица Адамара, которая имеет ортогональные столбцы, поэтому мы ожидаем, что угол подпространства будет \(\frac{\pi}{2}\):

>>> import numpy as np
>>> from scipy.linalg import hadamard, subspace_angles
>>> rng = np.random.default_rng()
>>> H = hadamard(4)
>>> print(H)
[[ 1  1  1  1]
 [ 1 -1  1 -1]
 [ 1  1 -1 -1]
 [ 1 -1 -1  1]]
>>> np.rad2deg(subspace_angles(H[:, :2], H[:, 2:]))
array([ 90.,  90.])

И угол подпространства матрицы с самой собой должен быть нулевым:

>>> subspace_angles(H[:, :2], H[:, :2]) <= 2 * np.finfo(float).eps
array([ True,  True], dtype=bool)

Углы между неортогональными подпространствами находятся между этими крайностями:

>>> x = rng.standard_normal((4, 3))
>>> np.rad2deg(subspace_angles(x[:, :2], x[:, [2]]))
array([ 55.832])  # random