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 A 和 em B 列空间之间的子空间角,按降序排列。
注释
这根据 [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