scipy.linalg.

subspace_angles#

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

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

文档假设数组参数具有指定的“核心”形状。然而,此函数的数组参数可能在核心形状前附加额外的“批处理”维度。在这种情况下,数组被视为低维切片的批次;详情请参阅批处理线性运算

参数:
A(M, N) 类数组

第一个输入数组。

B(M, K) 类数组

第二个输入数组。

返回:
anglesndarray, 形状 (min(N, K),)

AB 列空间之间的子空间角,按降序排列。

另请参阅

orth
svd

备注

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

版本 1.0 新增。

参考文献

[1]

Knyazev A, Argentati M (2002) Principal Angles between Subspaces in an A-Based Scalar Product: Algorithms and Perturbation Estimates. 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