subspace_angles#
- scipy.linalg.subspace_angles(A, B)[источник]#
Вычислить углы между подпространствами двух матриц.
Документация написана в предположении, что аргументы-массивы имеют указанные «основные» формы. Однако аргументы-массивы этой функции могут иметь дополнительные «пакетные» измерения, добавленные перед основной формой. В этом случае массив обрабатывается как пакет низкоразмерных срезов; см. Пакетные линейные операции подробности.
- Параметры:
- A(M, N) array_like
Первый входной массив.
- B(M, K) array_like
Второй входной массив.
- Возвращает:
- углыndarray, форма (min(N, K),)
Углы между подпространствами, образованными столбцовыми пространствами A и B в порядке убывания.
Примечания
Это вычисляет углы подпространств согласно формуле, предоставленной в [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