scipy.linalg.

subspace_angles#

scipy.linalg.subspace_angles(A, B)[源代码]#

计算两个矩阵之间的子空间角。

参数:
A(M, N) array_like

第一个输入阵列。

B(M, K) array_like

第二个输入阵列。

返回:
anglesndarray, shape (min(N, K),)

em Aem B 列空间之间的子空间角,按降序排列。

另请参见

orth
svd

注释

这根据 [1] 中提供的公式计算子空间角。要与 MATLAB 和 Octave 行为一致,请使用 angles[0]

从 1.0 版本开始添加。

参考

[1]

Knyazev A, Argentati M (2002) A-Based Scalar Product 中子空间之间的主角度:算法和扰动估计。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