The special orthogonal group

For this Lie group, several implementations are already covered by the defaults in the generic (matrix) multiplication operation.

Functions

Base.expMethod
exp(G, X)
exp!(G, g, X)

Compute the Lie group exponential function on the OrthogonalGroup $\mathrm{O}(2)$ or SpecialOrthogonalGroup $\mathrm{SO}(2)$, where e is the Identity{MatrixMultiplicationGroupOperation} and G uses a TypeParameter for dispatch.

Since the Lie algebra of both groups agrees and consist of the set of skew symmetric matrices, these simplify for the case of $2×2$ matrices to $X=\begin{pmatrix} 0 & -α\\ α & 0\end{pmatrix}$, for some $α∈ℝ$.

Their exponential is

\[\exp_{\mathcal G}(X) = \begin{pmatrix} \cos(α) & -\sin(α)\\ \sin(α) & \cos(α)\end{pmatrix}.\]

This result can be computed in-place of g.

Note that since $\mathrm{O}(2)$ consists of two disjoint connected components and the exponential map is smooth, the result $g$ always lies in the connected component of the identity.

source
Base.expMethod
exp(G, X)
exp!(G, g, X)

Compute the Lie group exponential function on the OrthogonalGroup $\mathrm{O}(3)$ or SpecialOrthogonalGroup $\mathrm{SO}(3)$, where e is the Identity{MatrixMultiplicationGroupOperation} and G uses a TypeParameter for dispatch.

Since the Lie algebra of both groups agrees and consist of the set of skew symmetric matrices, the $3×3$ skew symmetric matrices are of the form

\[ X = \begin{pmatrix} 0 & -c & b\\ c & 0 & -a\\ -b & a & 0\end{pmatrix},\]

for some $a, b, c ∈ ℝ$. To compute the exponential, the Rodrigues' rotation formula can be used. With $α = \sqrt{a^2+b^2+c^2} = \frac{1}{\sqrt{2}}\lVert X \rVert_{}$ we obtain for $α ≠ 0$

\[\exp_{\mathcal G}(X) = I_3 + \frac{\sin}{α}X + \frac{(1 - \cos)}{α^2}X^2,\]

and \exp{\mathcal G}(X) = I3`` otherwise.

This result can be computed in-place of g.

Note that since $\mathrm{SO}(3)$ consists of two disjoint connected components and the exponential map is smooth, the result $g$ always lies in the connected component of the identity.

source
Base.expMethod
exp(G, e, X)
exp!(G, e, g, X)

Compute the Lie group exponential function on the OrthogonalGroup $\mathrm{O}(4)$ or SpecialOrthogonalGroup $\mathrm{SO}(4)$, where e is the Identity{MatrixMultiplicationGroupOperation} and G uses a TypeParameter for dispatch.

Similar to the $3×3$ case, an efficient computation is provided, adapted from [GX02], [AR13] with a few numerical stabilisations.

source
Base.logMethod
log(G, g)
log!(G, X, g)

Compute the Lie group logarithm function on the OrthogonalGroup $\mathrm{O}(2)$ or SpecialOrthogonalGroup $\mathrm{SO}(2)$, where e is the Identity{MatrixMultiplicationGroupOperation} and G uses a TypeParameter for dispatch.

For the two-dimensional case, any rotation matrix $g$ can be represented as $\begin{pmatrix} \cos(α) & -\sin(α)\\ \sin(α) & \cos(α)\end{pmatrix}$. For the SpecialOrthogonalGroup, $g$ might also include reflections.

The logarithm is then

\[\log_{\mathcal G}(g) = \begin{pmatrix} 0 & α\\ -α & 0\end{pmatrix}.\]

This result can be computed in-place of X

Note the logarithmic map is only locally around the identity uniquely determined. Especially, since $\mathrm{O}(2)$ consists of two disjoint connected components and the exponential map is smooth, for any $g$ in the other component, the logarithmic map is defined, but not the inverse of the exponential map.

source
Base.logMethod
log(G, g)
log!(G, X, g)

Compute the Lie group logarithm function on the OrthogonalGroup $\mathrm{O}(3)$ or SpecialOrthogonalGroup $\mathrm{SO}(3)$, where e is the Identity{MatrixMultiplicationGroupOperation} and G uses a TypeParameter for dispatch.

Here, $\exp_{\mathcal G}(X) = g$ is inverted using the Rodrigues' rotation formula

\[\exp_{\mathcal G}(X) = I_3 + \frac{\sin}{α}X + \frac{(1 - \cos)}{α^2}X^2,\]

For $α ∉ \{ 0, π \}$ we obtain $X$ from the observation that

\[\mathrm{tr}(g) = 1 + 2\cos(α) \qquad\text{ and }\qquad \frac{1}{2}(g-g^\mathrm{T}) = \sin(α)X.\]

For $α = 0$ we have $g = I_3$ and $X = 0$.

For $α = π$ we have to solve $X^2 = \frac{1}{2}(g-I_3)$, where $X$ is skew-symmetric and hence we have to solve for three unknowns.

\[\log_{\mathcal G}(g) = X.\]

This result can be computed in-place of X

Note the logarithmic map is only locally around the identity uniquely determined. Especially, since $\mathrm{O}(3)$ consists of two disjoint connected components and the exponential map is smooth, for any $g$ in the other component, the logarithmic map is defined, but not the inverse of the exponential map.

source
Base.logMethod
log(G, g)
log!(G, X, g)

Compute the Lie group logarithm function on the OrthogonalGroup $\mathrm{O}(4)$ or SpecialOrthogonalGroup $\mathrm{SO}(4)$, where e is the Identity{MatrixMultiplicationGroupOperation} and G uses a TypeParameter for dispatch.

The implementation is based on a generalized variant of the Rodrigues' like formula. For details, see [GX02, Section 3].

This result can be computed in-place of X

Note the logarithmic map is only locally around the identity uniquely determined.

source
ManifoldsBase.exp!Method
exp(G, X)
exp!(G, g, X)

Compute the Lie group exponential function on the OrthogonalGroup $\mathrm{O}(2)$ or SpecialOrthogonalGroup $\mathrm{SO}(2)$, where e is the Identity{MatrixMultiplicationGroupOperation} and G uses a TypeParameter for dispatch.

Since the Lie algebra of both groups agrees and consist of the set of skew symmetric matrices, these simplify for the case of $2×2$ matrices to $X=\begin{pmatrix} 0 & -α\\ α & 0\end{pmatrix}$, for some $α∈ℝ$.

Their exponential is

\[\exp_{\mathcal G}(X) = \begin{pmatrix} \cos(α) & -\sin(α)\\ \sin(α) & \cos(α)\end{pmatrix}.\]

This result can be computed in-place of g.

Note that since $\mathrm{O}(2)$ consists of two disjoint connected components and the exponential map is smooth, the result $g$ always lies in the connected component of the identity.

source
ManifoldsBase.exp!Method
exp(G, X)
exp!(G, g, X)

Compute the Lie group exponential function on the OrthogonalGroup $\mathrm{O}(3)$ or SpecialOrthogonalGroup $\mathrm{SO}(3)$, where e is the Identity{MatrixMultiplicationGroupOperation} and G uses a TypeParameter for dispatch.

Since the Lie algebra of both groups agrees and consist of the set of skew symmetric matrices, the $3×3$ skew symmetric matrices are of the form

\[ X = \begin{pmatrix} 0 & -c & b\\ c & 0 & -a\\ -b & a & 0\end{pmatrix},\]

for some $a, b, c ∈ ℝ$. To compute the exponential, the Rodrigues' rotation formula can be used. With $α = \sqrt{a^2+b^2+c^2} = \frac{1}{\sqrt{2}}\lVert X \rVert_{}$ we obtain for $α ≠ 0$

\[\exp_{\mathcal G}(X) = I_3 + \frac{\sin}{α}X + \frac{(1 - \cos)}{α^2}X^2,\]

and \exp{\mathcal G}(X) = I3`` otherwise.

This result can be computed in-place of g.

Note that since $\mathrm{SO}(3)$ consists of two disjoint connected components and the exponential map is smooth, the result $g$ always lies in the connected component of the identity.

source
ManifoldsBase.get_coordinates!Method
get_coordinates(𝔤::OrthogonalLieAlgebra, X, ::DefaultLieAlgebraOrthogonalBasis)
get_coordinates(G::SpecialOrthogonalLieAlgebra, X, ::DefaultLieAlgebraOrthogonalBasis)
get_coordinates!(G::OrthogonalLieAlgebra, c, X ::DefaultLieAlgebraOrthogonalBasis)
get_coordinates!(G::SpecialOrthogonalLieAlgebra, c, X ::DefaultLieAlgebraOrthogonalBasis)

Compute the vector of coordinates $c ∈ ℝ^d$ from the Lie algebra tangent vector $X ∈ 𝔬(n)$ of the OrthogonalGroup O(n) in the DefaultLieAlgebraOrthogonalBasis, where $d$ is the dimension of the Lie algebra. This is also the version used in vee.

For $O(2)$ there is only one coefficient $α$ in the basis $\begin{pmatrix} 0 & -α\\ α & 0\end{pmatrix}$, which is returned as $c = (α)^\mathrm{T}$.

A usual basis representation of ``𝔬(3) is given by

\[ X = \begin{pmatrix} 0 & -γ & β\\ γ & 0 & -α\\ -β & α & 0\end{pmatrix},\]

hence the coordinate vector is $c = (α, β, γ)^\mathrm{T} ∈ ℝ^3$.

For n ≥ 4the lower triangular part is added toc` row-wise.

source
ManifoldsBase.get_coordinatesMethod
get_coordinates(𝔤::OrthogonalLieAlgebra, X, ::DefaultLieAlgebraOrthogonalBasis)
get_coordinates(G::SpecialOrthogonalLieAlgebra, X, ::DefaultLieAlgebraOrthogonalBasis)
get_coordinates!(G::OrthogonalLieAlgebra, c, X ::DefaultLieAlgebraOrthogonalBasis)
get_coordinates!(G::SpecialOrthogonalLieAlgebra, c, X ::DefaultLieAlgebraOrthogonalBasis)

Compute the vector of coordinates $c ∈ ℝ^d$ from the Lie algebra tangent vector $X ∈ 𝔬(n)$ of the OrthogonalGroup O(n) in the DefaultLieAlgebraOrthogonalBasis, where $d$ is the dimension of the Lie algebra. This is also the version used in vee.

For $O(2)$ there is only one coefficient $α$ in the basis $\begin{pmatrix} 0 & -α\\ α & 0\end{pmatrix}$, which is returned as $c = (α)^\mathrm{T}$.

A usual basis representation of ``𝔬(3) is given by

\[ X = \begin{pmatrix} 0 & -γ & β\\ γ & 0 & -α\\ -β & α & 0\end{pmatrix},\]

hence the coordinate vector is $c = (α, β, γ)^\mathrm{T} ∈ ℝ^3$.

For n ≥ 4the lower triangular part is added toc` row-wise.

source
ManifoldsBase.get_vector!Method
get_vector(G::OrthogonalLieAlgebra, e, c, ::DefaultLieAlgebraOrthogonalBasis)
get_vector(G::SpecialOrthogonalLieAlgebra, e, c, ::DefaultLieAlgebraOrthogonalBasis)
get_vector!(G::OrthogonalLieAlgebra, X, e, c, ::DefaultLieAlgebraOrthogonalBasis)
get_vector!(G::SpecialOrthogonalLieAlgebra, X, e, c, ::DefaultLieAlgebraOrthogonalBasis)

Compute the tangent vector $X ∈ 𝔬(n)$ based on a vector of coordinates $c ∈ ℝ^d$, where $d$ is the dimension of the Lie algebra of the OrthogonalGroup O(n) and the coordinates are with respect to the DefaultLieAlgebraOrthogonalBasis. This is also the version used in hat.

For $O(2)$ there is only one coefficient ``$c = (α)^\mathrm{T}$ and hence $X = \begin{pmatrix} 0 & -α\\ α & 0\end{pmatrix}$ is returned.

For $n=3$ a usual representtion turns $c = (α, β, γ)^\mathrm{T} ∈ ℝ^3$ into

\[ X = \begin{pmatrix} 0 & -γ & β\\ γ & 0 & -α\\ -β & α & 0\end{pmatrix},\]

hence the coordinate vector is .

For n ≥ 4` all further coefficients are used to fill up the following rows of the lower triangular part – which determines the upper triangular part due to skew-symmetry

source
ManifoldsBase.get_vectorMethod
get_vector(G::OrthogonalLieAlgebra, e, c, ::DefaultLieAlgebraOrthogonalBasis)
get_vector(G::SpecialOrthogonalLieAlgebra, e, c, ::DefaultLieAlgebraOrthogonalBasis)
get_vector!(G::OrthogonalLieAlgebra, X, e, c, ::DefaultLieAlgebraOrthogonalBasis)
get_vector!(G::SpecialOrthogonalLieAlgebra, X, e, c, ::DefaultLieAlgebraOrthogonalBasis)

Compute the tangent vector $X ∈ 𝔬(n)$ based on a vector of coordinates $c ∈ ℝ^d$, where $d$ is the dimension of the Lie algebra of the OrthogonalGroup O(n) and the coordinates are with respect to the DefaultLieAlgebraOrthogonalBasis. This is also the version used in hat.

For $O(2)$ there is only one coefficient ``$c = (α)^\mathrm{T}$ and hence $X = \begin{pmatrix} 0 & -α\\ α & 0\end{pmatrix}$ is returned.

For $n=3$ a usual representtion turns $c = (α, β, γ)^\mathrm{T} ∈ ℝ^3$ into

\[ X = \begin{pmatrix} 0 & -γ & β\\ γ & 0 & -α\\ -β & α & 0\end{pmatrix},\]

hence the coordinate vector is .

For n ≥ 4` all further coefficients are used to fill up the following rows of the lower triangular part – which determines the upper triangular part due to skew-symmetry

source
ManifoldsBase.log!Method
log(G, g)
log!(G, X, g)

Compute the Lie group logarithm function on the OrthogonalGroup $\mathrm{O}(2)$ or SpecialOrthogonalGroup $\mathrm{SO}(2)$, where e is the Identity{MatrixMultiplicationGroupOperation} and G uses a TypeParameter for dispatch.

For the two-dimensional case, any rotation matrix $g$ can be represented as $\begin{pmatrix} \cos(α) & -\sin(α)\\ \sin(α) & \cos(α)\end{pmatrix}$. For the SpecialOrthogonalGroup, $g$ might also include reflections.

The logarithm is then

\[\log_{\mathcal G}(g) = \begin{pmatrix} 0 & α\\ -α & 0\end{pmatrix}.\]

This result can be computed in-place of X

Note the logarithmic map is only locally around the identity uniquely determined. Especially, since $\mathrm{O}(2)$ consists of two disjoint connected components and the exponential map is smooth, for any $g$ in the other component, the logarithmic map is defined, but not the inverse of the exponential map.

source
ManifoldsBase.log!Method
log(G, g)
log!(G, X, g)

Compute the Lie group logarithm function on the OrthogonalGroup $\mathrm{O}(3)$ or SpecialOrthogonalGroup $\mathrm{SO}(3)$, where e is the Identity{MatrixMultiplicationGroupOperation} and G uses a TypeParameter for dispatch.

Here, $\exp_{\mathcal G}(X) = g$ is inverted using the Rodrigues' rotation formula

\[\exp_{\mathcal G}(X) = I_3 + \frac{\sin}{α}X + \frac{(1 - \cos)}{α^2}X^2,\]

For $α ∉ \{ 0, π \}$ we obtain $X$ from the observation that

\[\mathrm{tr}(g) = 1 + 2\cos(α) \qquad\text{ and }\qquad \frac{1}{2}(g-g^\mathrm{T}) = \sin(α)X.\]

For $α = 0$ we have $g = I_3$ and $X = 0$.

For $α = π$ we have to solve $X^2 = \frac{1}{2}(g-I_3)$, where $X$ is skew-symmetric and hence we have to solve for three unknowns.

\[\log_{\mathcal G}(g) = X.\]

This result can be computed in-place of X

Note the logarithmic map is only locally around the identity uniquely determined. Especially, since $\mathrm{O}(3)$ consists of two disjoint connected components and the exponential map is smooth, for any $g$ in the other component, the logarithmic map is defined, but not the inverse of the exponential map.

source
ManifoldsBase.log!Method
log(G, g)
log!(G, X, g)

Compute the Lie group logarithm function on the OrthogonalGroup $\mathrm{O}(4)$ or SpecialOrthogonalGroup $\mathrm{SO}(4)$, where e is the Identity{MatrixMultiplicationGroupOperation} and G uses a TypeParameter for dispatch.

The implementation is based on a generalized variant of the Rodrigues' like formula. For details, see [GX02, Section 3].

This result can be computed in-place of X

Note the logarithmic map is only locally around the identity uniquely determined.

source