# scipy.linalg.subspace_angles¶

scipy.linalg.subspace_angles(A, B)[source]

Compute the subspace angles between two matrices.

Parameters: A : (M, N) array_like The first input array. B : (M, K) array_like The second input array. angles : ndarray, shape (min(N, K),) The subspace angles between the column spaces of A and B in descending order.

Notes

This computes the subspace angles according to the formula provided in [1]. For equivalence with MATLAB and Octave behavior, use angles[0].

New in version 1.0.

References

 [1] (1, 2) 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.

Examples

A Hadamard matrix, which has orthogonal columns, so we expect that the suspace angle to be $$\frac{\pi}{2}$$:

>>> from scipy.linalg import hadamard, subspace_angles
>>> print(H)
[[ 1  1  1  1]
[ 1 -1  1 -1]
[ 1  1 -1 -1]
[ 1 -1 -1  1]]
array([ 90.,  90.])


And the subspace angle of a matrix to itself should be zero:

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


The angles between non-orthogonal subspaces are in between these extremes:

>>> x = np.random.RandomState(0).randn(4, 3)