# Generalized Grassmann

`Manifolds.GeneralizedGrassmann`

β Type`GeneralizedGrassmann{T,π½,TB<:AbstractMatrix} <: AbstractDecoratorManifold{π½}`

The generalized Grassmann manifold $\operatorname{Gr}(n,k,B)$ consists of all subspaces spanned by $k$ linear independent vectors $π½^n$, where $π½ β \{β, β\}$ is either the real- (or complex-) valued vectors. This yields all $k$-dimensional subspaces of $β^n$ for the real-valued case and all $2k$-dimensional subspaces of $β^n$ for the second.

The manifold can be represented as

\[\operatorname{Gr}(n, k, B) := \bigl\{ \operatorname{span}(p)\ \big|\ p β π½^{nΓk}, p^\mathrm{H}Bp = I_k\},\]

where $β
^{\mathrm{H}}$ denotes the complex conjugate (or Hermitian) transpose and $I_k$ is the $kΓk$ identity matrix. This means, that the columns of $p$ form an unitary basis of the subspace with respect to the scaled inner product, that is a point on $\operatorname{Gr}(n,k,B)$, and hence the subspace can actually be represented by a whole equivalence class of representers. For $B=I_n$ this simplifies to the `Grassmann`

manifold.

The tangent space at a point (subspace) $p$ is given by

\[T_x\mathrm{Gr}(n,k,B) = \bigl\{ X β π½^{nΓk} : X^{\mathrm{H}}Bp + p^{\mathrm{H}}BX = 0_{k} \bigr\},\]

where $0_{k}$ denotes the $kΓk$ zero matrix.

Note that a point $p β \operatorname{Gr}(n,k,B)$ might be represented by different matrices (i.e. matrices with $B$-unitary column vectors that span the same subspace). Different representations of $p$ also lead to different representation matrices for the tangent space $T_p\mathrm{Gr}(n,k,B)$

The manifold is named after Hermann G. GraΓmann (1809-1877).

**Constructor**

`GeneralizedGrassmann(n, k, B=I_n, field=β)`

Generate the (real-valued) Generalized Grassmann manifold of $nΓk$ dimensional orthonormal matrices with scalar product `B`

.

`Base.exp`

β Method`exp(M::GeneralizedGrassmann, p, X)`

Compute the exponential map on the `GeneralizedGrassmann`

`M`

$= \mathrm{Gr}(n,k,B)$ starting in `p`

with tangent vector (direction) `X`

. Let $X^{\mathrm{H}}BX = USV$ denote the SVD decomposition of $X^{\mathrm{H}}BX$. Then the exponential map is written using

\[\exp_p X = p V\cos(S)V^\mathrm{H} + U\sin(S)V^\mathrm{H},\]

where $β ^{\mathrm{H}}$ denotes the complex conjugate transposed or Hermitian and the cosine and sine are applied element wise to the diagonal entries of $S$.

`Base.log`

β Method`log(M::GeneralizedGrassmann, p, q)`

Compute the logarithmic map on the `GeneralizedGrassmann`

`M`

$= \mathcal M=\mathrm{Gr}(n,k,B)$, i.e. the tangent vector `X`

whose corresponding `geodesic`

starting from `p`

reaches `q`

after time 1 on `M`

. The formula reads

\[\log_p q = Vβ \operatorname{atan}(S) β U^\mathrm{H},\]

where $β ^{\mathrm{H}}$ denotes the complex conjugate transposed or Hermitian. The matrices $U$ and $V$ are the unitary matrices, and $S$ is the diagonal matrix containing the singular values of the SVD-decomposition

\[USV = (q^\mathrm{H}Bp)^{-1} ( q^\mathrm{H} - q^\mathrm{H}Bpp^\mathrm{H}).\]

In this formula the $\operatorname{atan}$ is meant elementwise.

`Base.rand`

β Method`rand(::GeneralizedGrassmann; vector_at=nothing, Ο::Real=1.0)`

When `vector_at`

is `nothing`

, return a random (Gaussian) point `p`

on the `GeneralizedGrassmann`

manifold `M`

by generating a (Gaussian) matrix with standard deviation `Ο`

and return the (generalized) orthogonalized version, i.e. return the projection onto the manifold of the Q component of the QR decomposition of the random matrix of size $nΓk$.

When `vector_at`

is not `nothing`

, return a (Gaussian) random vector from the tangent space $T_{vector\_at}\mathrm{St}(n,k)$ with mean zero and standard deviation `Ο`

by projecting a random Matrix onto the tangent vector at `vector_at`

.

`ManifoldsBase.change_metric`

β Method`change_metric(M::GeneralizedGrassmann, ::EuclideanMetric, p X)`

Change `X`

to the corresponding vector with respect to the metric of the `GeneralizedGrassmann`

`M`

, i.e. let $B=LL'$ be the Cholesky decomposition of the matrix `M.B`

, then the corresponding vector is $L\X$.

`ManifoldsBase.change_representer`

β Method`change_representer(M::GeneralizedGrassmann, ::EuclideanMetric, p, X)`

Change `X`

to the corresponding representer of a cotangent vector at `p`

with respect to the scaled metric of the `GeneralizedGrassmann`

`M`

, i.e, since

\[g_p(X,Y) = \operatorname{tr}(Y^{\mathrm{H}}BZ) = \operatorname{tr}(X^{\mathrm{H}}Z) = β¨X,Zβ©\]

has to hold for all $Z$, where the repreenter `X`

is given, the resulting representer with respect to the metric on the `GeneralizedGrassmann`

is given by $Y = B^{-1}X$.

`ManifoldsBase.check_point`

β Method`check_point(M::GeneralizedGrassmann, p)`

Check whether `p`

is representing a point on the `GeneralizedGrassmann`

`M`

, i.e. its a `n`

-by-`k`

matrix of unitary column vectors with respect to the B inner prudct and of correct `eltype`

with respect to `π½`

.

`ManifoldsBase.check_vector`

β Method`check_vector(M::GeneralizedGrassmann, p, X; kwargs...)`

Check whether `X`

is a tangent vector in the tangent space of `p`

on the `GeneralizedGrassmann`

`M`

, i.e. that `X`

is of size and type as well as that

\[ p^{\mathrm{H}}BX + \overline{X^{\mathrm{H}}Bp} = 0_k,\]

where $β ^{\mathrm{H}}$ denotes the complex conjugate transpose or Hermitian, $\overline{β }$ the (elementwise) complex conjugate, and $0_k$ denotes the $kΓk$ zero natrix.

`ManifoldsBase.distance`

β Method`distance(M::GeneralizedGrassmann, p, q)`

Compute the Riemannian distance on `GeneralizedGrassmann`

manifold `M`

$= \mathrm{Gr}(n,k,B)$.

The distance is given by

\[d_{\mathrm{Gr}(n,k,B)}(p,q) = \operatorname{norm}(\log_p(q)).\]

`ManifoldsBase.injectivity_radius`

β Method```
injectivity_radius(M::GeneralizedGrassmann)
injectivity_radius(M::GeneralizedGrassmann, p)
```

Return the injectivity radius on the `GeneralizedGrassmann`

`M`

, which is $\frac{Ο}{2}$.

`ManifoldsBase.inner`

β Method`inner(M::GeneralizedGrassmann, p, X, Y)`

Compute the inner product for two tangent vectors `X`

, `Y`

from the tangent space of `p`

on the `GeneralizedGrassmann`

manifold `M`

. The formula reads

\[g_p(X,Y) = \operatorname{tr}(X^{\mathrm{H}}BY),\]

where $β ^{\mathrm{H}}$ denotes the complex conjugate transposed or Hermitian.

`ManifoldsBase.is_flat`

β Method`is_flat(M::GeneralizedGrassmann)`

Return true if `GeneralizedGrassmann`

`M`

is one-dimensional.

`ManifoldsBase.manifold_dimension`

β Method`manifold_dimension(M::GeneralizedGrassmann)`

Return the dimension of the `GeneralizedGrassmann(n,k,π½)`

manifold `M`

, i.e.

\[\dim \operatorname{Gr}(n,k,B) = k(n-k) \dim_β π½,\]

where $\dim_β π½$ is the `real_dimension`

of `π½`

.

`ManifoldsBase.project`

β Method`project(M::GeneralizedGrassmann, p, X)`

Project the `n`

-by-`k`

`X`

onto the tangent space of `p`

on the `GeneralizedGrassmann`

`M`

, which is computed by

\[\operatorname{proj_p}(X) = X - pp^{\mathrm{H}}B^\mathrm{T}X,\]

where $β ^{\mathrm{H}}$ denotes the complex conjugate transposed or Hermitian and $β ^{\mathrm{T}}$ the transpose.

`ManifoldsBase.project`

β Method`project(M::GeneralizedGrassmann, p)`

Project `p`

from the embedding onto the `GeneralizedGrassmann`

`M`

, i.e. compute `q`

as the polar decomposition of $p$ such that $q^{\mathrm{H}}Bq$ is the identity, where $β
^{\mathrm{H}}$ denotes the Hermitian, i.e. complex conjugate transpose.

`ManifoldsBase.representation_size`

β Method`representation_size(M::GeneralizedGrassmann)`

Return the represenation size or matrix dimension of a point on the `GeneralizedGrassmann`

`M`

, i.e. $(n,k)$ for both the real-valued and the complex value case.

`ManifoldsBase.retract`

β Method`retract(M::GeneralizedGrassmann, p, X, ::PolarRetraction)`

Compute the SVD-based retraction `PolarRetraction`

on the `GeneralizedGrassmann`

`M`

, by `project`

ing $p + X$ onto `M`

.

`ManifoldsBase.zero_vector`

β Method`zero_vector(M::GeneralizedGrassmann, p)`

Return the zero tangent vector from the tangent space at `p`

on the `GeneralizedGrassmann`

`M`

, which is given by a zero matrix the same size as `p`

.

`Statistics.mean`

β Method```
mean(
M::GeneralizedGrassmann,
x::AbstractVector,
[w::AbstractWeights,]
method = GeodesicInterpolationWithinRadius(Ο/4);
kwargs...,
)
```

Compute the Riemannian `mean`

of `x`

using `GeodesicInterpolationWithinRadius`

.