Orthogonal and Unitary matrices

Both OrthogonalMatrices and UnitaryMatrices are quite similar, as are Rotations, as well as unitary matrices with determinant equal to one. So these share a {common implementation}(@ref generalunitarymatrices)

Orthogonal Matrices

Manifolds.OrthogonalMatrices โ Type
 OrthogonalMatrices{n} = GeneralUnitaryMatrices{n,โ,AbsoluteDeterminantOneMatrices}

The manifold of (real) orthogonal matrices $\mathrm{O}(n)$.

OrthogonalMatrices(n)
source

Unitary Matrices

Manifolds.UnitaryMatrices โ Type
const UnitaryMatrices{n,๐ฝ} = AbstarctUnitaryMatrices{n,๐ฝ,AbsoluteDeterminantOneMatrices}

The manifold $U(n,๐ฝ)$ of $nรn$ complex matrices (when ๐ฝ=โ) or quaternionic matrices (when ๐ฝ=โ) such that

$p^{\mathrm{H}}p = \mathrm{I}_n,$

where $\mathrm{I}_n$ is the $nรn$ identity matrix. Such matrices p have a property that $\lVert \det(p) \rVert = 1$.

The tangent spaces are given by

$$$T_pU(n) \coloneqq \bigl\{ X \big| pY \text{ where } Y \text{ is skew symmetric, i. e. } Y = -Y^{\mathrm{H}} \bigr\}$$$

But note that tangent vectors are represented in the Lie algebra, i.e. just using $Y$ in the representation above. If you prefer the representation as X you can use the Stiefel(n, n, โ) manifold.

Constructor

UnitaryMatrices(n, ๐ฝ::AbstractNumbers=โ)

see also OrthogonalMatrices for the real valued case.

source
Base.rand โ Method
rand(::Unitary; vector_at=nothing, ฯ::Real=1.0)

Generate a random point on the UnitaryMatrices manifold, if vector_at is nothing, by computing the QR decomposition of a $nรx$ matrix.

Generate a tangent vector at vector_at by projecting a normally distributed matrix onto the tangent space.

source
ManifoldDiff.riemannian_Hessian โ Method
riemannian_Hessian(M::UnitaryMatrices, p, G, H, X)

The Riemannian Hessian can be computed by adopting Eq. (5.6) [Ngu23], so very similar to the complex Stiefel manifold. The only difference is, that here the tangent vectors are stored in the Lie algebra, i.e. the update direction is actually $pX$ instead of just $X$ (in Stiefel). and that means the inverse has to be applied to the (Euclidean) Hessian to map it into the Lie algebra.

source
ManifoldsBase.Weingarten โ Method
Weingarten(M::UnitaryMatrices, p, X, V)

Compute the Weingarten map $\mathcal W_p$ at p on the Stiefel M with respect to the tangent vector $X \in T_p\mathcal M$ and the normal vector $V \in N_p\mathcal M$.

The formula is due to [AMT13] given by

$$$\mathcal W_p(X,V) = -\frac{1}{2}p\bigl(V^{\mathrm{H}}X - X^\mathrm{H}V\bigr)$$$
source
ManifoldsBase.manifold_dimension โ Method
manifold_dimension(M::UnitaryMatrices{n,โ}) where {n}

Return the dimension of the manifold unitary matrices.

$$$\dim_{\mathrm{U}(n)} = n^2.$$$
source
ManifoldsBase.manifold_dimension โ Method
manifold_dimension(M::UnitaryMatrices{<:Any,โ})

Return the dimension of the manifold unitary matrices.

$$$\dim_{\mathrm{U}(n, โ)} = n(2n+1).$$$
source

Common functions

Manifolds.GeneralUnitaryMatrices โ Type
GeneralUnitaryMatrices{T,๐ฝ,S<:AbstractMatrixType} <: AbstractDecoratorManifold

A common parametric type for matrices with a unitary property of size $nรn$ over the field $๐ฝ$ which additionally have the AbstractMatrixType, e.g. are DeterminantOneMatrices.

source
Base.exp โ Method
exp(M::Rotations, p, X)
exp(M::OrthogonalMatrices, p, X)
exp(M::UnitaryMatrices, p, X)

Compute the exponential map, that is, since $X$ is represented in the Lie algebra,

exp_p(X) = p\mathrm{e}^X

For different sizes, like $n=2,3,4$, there are specialized implementations.

The algorithm used is a more numerically stable form of those proposed in [GX02] and [AR13].

source
Base.log โ Method
log(M::Rotations, p, X)
log(M::OrthogonalMatrices, p, X)
log(M::UnitaryMatrices, p, X)

Compute the logarithmic map, that is, since the resulting $X$ is represented in the Lie algebra,

log_p q = \log(p^{\mathrm{H}q)

which is projected onto the skew symmetric matrices for numerical stability.

source
Base.log โ Method
log(M::Rotations, p, q)

Compute the logarithmic map on the Rotations manifold M which is given by

$$$\log_p q = \operatorname{log}(p^{\mathrm{T}}q)$$$

where $\operatorname{Log}$ denotes the matrix logarithm. For numerical stability, the result is projected onto the set of skew symmetric matrices.

For antipodal rotations the function returns deterministically one of the tangent vectors that point at q.

source
Manifolds.cos_angles_4d_rotation_matrix โ Method
cos_angles_4d_rotation_matrix(R)

4D rotations can be described by two orthogonal planes that are unchanged by the action of the rotation (vectors within a plane rotate only within the plane). The cosines of the two angles $ฮฑ,ฮฒ$ of rotation about these planes may be obtained from the distinct real parts of the eigenvalues of the rotation matrix. This function computes these more efficiently by solving the system

\begin{aligned} \cos ฮฑ + \cos ฮฒ &= \frac{1}{2} \operatorname{tr}(R)\\ \cos ฮฑ \cos ฮฒ &= \frac{1}{8} \operatorname{tr}(R)^2 - \frac{1}{16} \operatorname{tr}((R - R^T)^2) - 1. \end{aligned}

By convention, the returned values are sorted in decreasing order. See also angles_4d_skew_sym_matrix.

source
Manifolds.manifold_volume โ Method
manifold_volume(::GeneralUnitaryMatrices{<:Any,โ,DeterminantOneMatrices})

Volume of the manifold of complex general unitary matrices of determinant one. The formula reads [BST03]

$$$\sqrt{n 2^{n-1}} ฯ^{(n-1)(n+2)/2} \prod_{k=1}^{n-1}\frac{1}{k!}$$$
source
Manifolds.manifold_volume โ Method
manifold_volume(::GeneralUnitaryMatrices{<:Any,โ,AbsoluteDeterminantOneMatrices})

Volume of the manifold of real orthogonal matrices of absolute determinant one. The formula reads [BST03]:

$$$\begin{cases} \frac{2^{k}(2\pi)^{k^2}}{\prod_{s=1}^{k-1} (2s)!} & \text{ if } n = 2k \\ \frac{2^{k+1}(2\pi)^{k(k+1)}}{\prod_{s=1}^{k-1} (2s+1)!} & \text{ if } n = 2k+1 \end{cases}$$$
source
Manifolds.manifold_volume โ Method
manifold_volume(::GeneralUnitaryMatrices{<:Any,โ,DeterminantOneMatrices})

Volume of the manifold of real orthogonal matrices of determinant one. The formula reads [BST03]:

$$$\begin{cases} 2 & \text{ if } n = 0 \\ \frac{2^{k-1/2}(2\pi)^{k^2}}{\prod_{s=1}^{k-1} (2s)!} & \text{ if } n = 2k+2 \\ \frac{2^{k+1/2}(2\pi)^{k(k+1)}}{\prod_{s=1}^{k-1} (2s+1)!} & \text{ if } n = 2k+1 \end{cases}$$$

It differs from the paper by a factor of sqrt(2) due to a different choice of normalization.

source
Manifolds.manifold_volume โ Method
manifold_volume(::GeneralUnitaryMatrices{<:Any,โ,AbsoluteDeterminantOneMatrices})

Volume of the manifold of complex general unitary matrices of absolute determinant one. The formula reads [BST03]

$$$\sqrt{n 2^{n+1}} ฯ^{n(n+1)/2} \prod_{k=1}^{n-1}\frac{1}{k!}$$$
source
Manifolds.volume_density โ Method
volume_density(M::GeneralUnitaryMatrices{<:Any,โ}, p, X)

Compute volume density function of a sphere, i.e. determinant of the differential of exponential map exp(M, p, X). It is derived from Eq. (4.1) and Corollary 4.4 in [CLLD22]. See also Theorem 4.1 in [FdHDF19], (note that it uses a different convention).

source
Manifolds.volume_density โ Method
volume_density(M::GeneralUnitaryMatrices{TypeParameter{Tuple{3}},โ}, p, X)

Compute the volume density on O(3)/SO(3). The formula reads [FdHDF19]

$$$\frac{1-1\cos(\sqrt{2}\lVert X \rVert)}{\lVert X \rVert^2}.$$$
source
ManifoldsBase.check_point โ Method
check_point(M::Rotations, p; kwargs...)

Check whether p is a valid point on the UnitaryMatrices M, i.e. that $p$ has a determinant of absolute value one, i.e. that $p^{\mathrm{H}}p$

The tolerance for the last test can be set using the kwargs....

source
ManifoldsBase.check_point โ Method
check_point(M::UnitaryMatrices, p; kwargs...)
check_point(M::OrthogonalMatrices, p; kwargs...)
check_point(M::GeneralUnitaryMatrices, p; kwargs...)

Check whether p is a valid point on the UnitaryMatrices or [OrthogonalMatrices] M, i.e. that $p$ has a determinant of absolute value one

The tolerance for the last test can be set using the kwargs....

source
ManifoldsBase.check_vector โ Method
check_vector(M::UnitaryMatrices, p, X; kwargs... )
check_vector(M::OrthogonalMatrices, p, X; kwargs... )
check_vector(M::Rotations, p, X; kwargs... )
check_vector(M::GeneralUnitaryMatrices, p, X; kwargs... )

Check whether X is a tangent vector to p on the UnitaryMatrices space M, i.e. after check_point(M,p), X has to be skew symmetric (Hermitian) and orthogonal to p.

The tolerance for the last test can be set using the kwargs....

source
ManifoldsBase.embed โ Method
embed(M::GeneralUnitaryMatrices, p, X)

Embed the tangent vector X at point p in M from its Lie algebra representation (set of skew matrices) into the Riemannian submanifold representation

$$$X_{\text{embedded}} = p * X$$$
source
ManifoldsBase.get_coordinates โ Method
get_coordinates(M::Rotations, p, X)
get_coordinates(M::OrthogonalMatrices, p, X)
get_coordinates(M::UnitaryMatrices, p, X)

Extract the unique tangent vector components $X^i$ at point p on Rotations $\mathrm{SO}(n)$ from the matrix representation X of the tangent vector.

The basis on the Lie algebra $๐ฐ๐ฌ(n)$ is chosen such that for $\mathrm{SO}(2)$, $X^1 = ฮธ = X_{21}$ is the angle of rotation, and for $\mathrm{SO}(3)$, $(X^1, X^2, X^3) = (X_{32}, X_{13}, X_{21}) = ฮธ u$ is the angular velocity and axis-angle representation, where $u$ is the unit vector along the axis of rotation.

For $\mathrm{SO}(n)$ where $n โฅ 4$, the additional elements of $X^i$ are $X^{j (j - 3)/2 + k + 1} = X_{jk}$, for $j โ [4,n], k โ [1,j)$.

source
ManifoldsBase.get_embedding โ Method
get_embedding(M::OrthogonalMatrices)
get_embedding(M::Rotations)
get_embedding(M::UnitaryMatrices)

Return the embedding, i.e. The $\mathbb F^{nรn}$, where $\mathbb F = \mathbb R$ for the first two and $\mathbb F = \mathbb C$ for the unitary matrices.

source
ManifoldsBase.get_vector โ Method
get_vector(M::OrthogonalMatrices, p, Xโฑ, B::DefaultOrthogonalBasis)
get_vector(M::Rotations, p, Xโฑ, B::DefaultOrthogonalBasis)

Convert the unique tangent vector components Xโฑ at point p on Rotations or OrthogonalMatrices to the matrix representation $X$ of the tangent vector. See get_coordinates for the conventions used.

source
ManifoldsBase.injectivity_radius โ Method
injectivity_radius(G::GeneralUnitaryMatrices{<:Any,โ,DeterminantOneMatrices})

Return the injectivity radius for general complex unitary matrix manifolds, where the determinant is $+1$, which is[1]

$$$\operatorname{inj}_{\mathrm{SU}(n)} = ฯ \sqrt{2}.$$$
source
ManifoldsBase.injectivity_radius โ Method
injectivity_radius(G::GeneraliUnitaryMatrices)

Return the injectivity radius for general unitary matrix manifolds, which is[1]

$$$\operatorname{inj}_{\mathrm{U}(n)} = ฯ.$$$
source
ManifoldsBase.manifold_dimension โ Method
manifold_dimension(M::GeneralUnitaryMatrices{<:Any,โ,DeterminantOneMatrices})

Return the dimension of the manifold of special unitary matrices.

$$$\dim_{\mathrm{SU}(n)} = n^2-1.$$$
source
ManifoldsBase.manifold_dimension โ Method
manifold_dimension(M::Rotations)
manifold_dimension(M::OrthogonalMatrices)

Return the dimension of the manifold orthogonal matrices and of the manifold of rotations

$$$\dim_{\mathrm{O}(n)} = \dim_{\mathrm{SO}(n)} = \frac{n(n-1)}{2}.$$$
source
ManifoldsBase.project โ Method
project(M::OrthogonalMatrices, p, X)
project(M::Rotations, p, X)
project(M::UnitaryMatrices, p, X)

Orthogonally project the tangent vector $X โ ๐ฝ^{nรn}$, $\mathbb F โ \{\mathbb R, \mathbb C\}$ to the tangent space of M at p, and change the representer to use the corresponding Lie algebra, i.e. we compute

$$$\operatorname{proj}_p(X) = \frac{p^{\mathrm{H}} X - (p^{\mathrm{H}} X)^{\mathrm{H}}}{2},$$$
source
ManifoldsBase.project โ Method
 project(G::UnitaryMatrices, p)
project(G::OrthogonalMatrices, p)

Project the point $p โ ๐ฝ^{nรn}$ to the nearest point in $\mathrm{U}(n,๐ฝ)=$Unitary(n,๐ฝ) under the Frobenius norm. If $p = U S V^\mathrm{H}$ is the singular value decomposition of $p$, then the projection is

$$$\operatorname{proj}_{\mathrm{U}(n,๐ฝ)} \colon p โฆ U V^\mathrm{H}.$$$
source
ManifoldsBase.retract โ Method
retract(M::Rotations, p, X, ::PolarRetraction)
retract(M::OrthogonalMatrices, p, X, ::PolarRetraction)

Compute the SVD-based retraction on the Rotations and OrthogonalMatrices M from p in direction X (as an element of the Lie group) and is a second-order approximation of the exponential map. Let

$$$USV = p + pX$$$

be the singular value decomposition, then the formula reads

$$$\operatorname{retr}_p X = UV^\mathrm{T}.$$$
source
ManifoldsBase.retract โ Method
retract(M::Rotations, p, X, ::QRRetraction)
retract(M::OrthogonalMatrices, p. X, ::QRRetraction)

Compute the QR-based retraction on the Rotations and OrthogonalMatrices M from p in direction X (as an element of the Lie group), which is a first-order approximation of the exponential map.

This is also the default retraction on these manifolds.

source