Documentation

Mathlib.Analysis.InnerProductSpace.SingularValues

Singular values for finite-dimensional linear maps #

For a linear map T between finite-dimensional inner product spaces E and F, we define the singular values, which are the square roots of the eigenvalues of T.adjoint ∘ₗ T, arranged in descending order and repeated according to their multiplicity.

With our definition, there are countably infinitely many singular values, but only the first rank(T) singular values are nonzero.

The singular values are zero-indexed, so T.singularValues 0 is the first singular value. This means the positive singular values occur at 0 ≤ i < rank(T) and not 1 ≤ i ≤ rank(T).

Main definition #

Main statements #

Implementation notes #

Suppose T : E →ₗ[𝕜] F where dim(E) = n, dim(F) = m. In mathematical literature, the number of singular values varies, with popular choices including

We take the last approach for the following reasons:

TODO #

References #

Tags #

singular values

noncomputable def LinearMap.singularValues {𝕜 : Type u_1} [RCLike 𝕜] {E : Type u_2} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E] [FiniteDimensional 𝕜 E] {F : Type u_3} [NormedAddCommGroup F] [InnerProductSpace 𝕜 F] [FiniteDimensional 𝕜 F] (T : E →ₗ[𝕜] F) :

If T : E →ₗ[𝕜] F is a linear map between finite dimensional inner product spaces, then T.singularValues is the infinite sequence where the first dim(E) elements are the square roots of eigenvalues of T.adjoint ∘ₗ T (which are guaranteed to be nonnegative real numbers), arranged in descending order and repeated according to their multiplicity, and the rest of the elements in the infinite sequence are zero. Please see the module docstring of Mathlib/Analysis/InnerProductSpace/SingularValues.lean for an explanation of this design decision.

The singular values are zero-indexed, so T.singularValues 0 refers to the first singular value. This means the positive singular values occur at 0 ≤ i < rank(T) and not 1 ≤ i ≤ rank(T).

Equations
Instances For
    theorem LinearMap.singularValues_nonneg {𝕜 : Type u_1} [RCLike 𝕜] {E : Type u_2} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E] [FiniteDimensional 𝕜 E] {F : Type u_3} [NormedAddCommGroup F] [InnerProductSpace 𝕜 F] [FiniteDimensional 𝕜 F] (T : E →ₗ[𝕜] F) (i : ) :
    theorem LinearMap.singularValues_fin {𝕜 : Type u_1} [RCLike 𝕜] {E : Type u_2} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E] [FiniteDimensional 𝕜 E] {F : Type u_3} [NormedAddCommGroup F] [InnerProductSpace 𝕜 F] [FiniteDimensional 𝕜 F] (T : E →ₗ[𝕜] F) {n : } (hn : Module.finrank 𝕜 E = n) (i : Fin n) :
    T.singularValues i = (.eigenvalues hn i)

    Connection between LinearMap.singularValues and LinearMap.IsSymmetric.eigenvalues. Together with LinearMap.singularValues_of_finrank_le, this characterizes the singular values.

    Because of the square root, you probably need to use T.isPositive_adjoint_comp_self.nonneg_eigenvalues to make effective use of this theorem.

    theorem LinearMap.singularValues_of_lt {𝕜 : Type u_1} [RCLike 𝕜] {E : Type u_2} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E] [FiniteDimensional 𝕜 E] {F : Type u_3} [NormedAddCommGroup F] [InnerProductSpace 𝕜 F] [FiniteDimensional 𝕜 F] (T : E →ₗ[𝕜] F) {n : } (hn : Module.finrank 𝕜 E = n) {i : } (hi : i < n) :
    theorem LinearMap.singularValues_of_finrank_le {𝕜 : Type u_1} [RCLike 𝕜] {E : Type u_2} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E] [FiniteDimensional 𝕜 E] {F : Type u_3} [NormedAddCommGroup F] [InnerProductSpace 𝕜 F] [FiniteDimensional 𝕜 F] (T : E →ₗ[𝕜] F) {i : } (hi : Module.finrank 𝕜 E i) :
    theorem LinearMap.sq_singularValues_fin {𝕜 : Type u_1} [RCLike 𝕜] {E : Type u_2} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E] [FiniteDimensional 𝕜 E] {F : Type u_3} [NormedAddCommGroup F] [InnerProductSpace 𝕜 F] [FiniteDimensional 𝕜 F] (T : E →ₗ[𝕜] F) {n : } (hn : Module.finrank 𝕜 E = n) (i : Fin n) :
    T.singularValues i ^ 2 = .eigenvalues hn i
    theorem LinearMap.sq_singularValues_of_lt {𝕜 : Type u_1} [RCLike 𝕜] {E : Type u_2} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E] [FiniteDimensional 𝕜 E] {F : Type u_3} [NormedAddCommGroup F] [InnerProductSpace 𝕜 F] [FiniteDimensional 𝕜 F] (T : E →ₗ[𝕜] F) {n : } (hn : Module.finrank 𝕜 E = n) {i : } (hi : i < n) :
    T.singularValues i ^ 2 = .eigenvalues hn i, hi

    7.68(a) from [Axl24]. Note that we have countably infinitely many singular values whereas there are only dim(domain(T)) singular values in [Axl24], so we modify the statement to account for this.

    7.68(b) from [Axl24]. See also LinearMap.support_singularValues for a stronger statement.

    @[simp]
    @[simp]
    theorem LinearMap.singularValues_eq_zero_iff {𝕜 : Type u_1} [RCLike 𝕜] {E : Type u_2} [NormedAddCommGroup E] [InnerProductSpace 𝕜 E] [FiniteDimensional 𝕜 E] {F : Type u_3} [NormedAddCommGroup F] [InnerProductSpace 𝕜 F] [FiniteDimensional 𝕜 F] (T : E →ₗ[𝕜] F) :