subspace_angles#
- scipy.linalg.subspace_angles(A, B)[source]#
Compute the subspace angles between two matrices.
The documentation is written assuming array arguments are of specified “core” shapes. However, array argument(s) of this function may have additional “batch” dimensions prepended to the core shape. In this case, the array is treated as a batch of lower-dimensional slices; see Batched Linear Operations for details.
- Parameters:
- A(M, N) array_like
The first input array.
- B(M, K) array_like
The second input array.
- Returns:
- anglesndarray, 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]
.Added in version 1.0.
References
[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.
Examples
An Hadamard matrix, which has orthogonal columns, so we expect that the suspace angle to be \(\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.])
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 = rng.standard_normal((4, 3)) >>> np.rad2deg(subspace_angles(x[:, :2], x[:, [2]])) array([ 55.832]) # random