# Shape spaces

Shape spaces are spaces of $k$ points in $\mathbb{R}^n$ up to simultaneous action of a group on all points. The most commonly encountered are Kendall's pre-shape and shape spaces. In the case of the Kendall's pre-shape spaces the action is translation and scaling. In the case of the Kendall's shape spaces the action is translation, scaling and rotation.

```
using Manifolds, Plots
M = KendallsShapeSpace(2, 3)
# two random point on the shape space
p = [
0.4385117672460505 -0.6877826444042382 0.24927087715818771
-0.3830259932279294 0.35347460720654283 0.029551386021386548
]
q = [
-0.42693314765896473 -0.3268567431952937 0.7537898908542584
0.3054740561061169 -0.18962848284149897 -0.11584557326461796
]
# let's plot them as triples of points on a plane
fig = scatter(p[1,:], p[2,:], label="p", aspect_ratio=:equal)
scatter!(fig, q[1,:], q[2,:], label="q")
# aligning q to p
A = get_orbit_action(M)
a = optimal_alignment(A, p, q)
rot_q = apply(A, a, q)
scatter!(fig, rot_q[1,:], rot_q[2,:], label="q aligned to p")
```

A more extensive usage example is available in the `hand_gestures.jl`

tutorial.

`Manifolds.KendallsPreShapeSpace`

— Type`KendallsPreShapeSpace{n,k} <: AbstractSphere{ℝ}`

Kendall's pre-shape space of $k$ landmarks in $ℝ^n$ represented by n×k matrices. In each row the sum of elements of a matrix is equal to 0. The Frobenius norm of the matrix is equal to 1 ^{[Kendall1984]}^{[Kendall1989]}.

The space can be interpreted as tuples of $k$ points in $ℝ^n$ up to simultaneous translation and scaling of all points, so this can be thought of as a quotient manifold.

**Constructor**

`KendallsPreShapeSpace(n::Int, k::Int)`

**See also**

`KendallsShapeSpace`

, esp. for the references

`Manifolds.KendallsShapeSpace`

— Type`KendallsShapeSpace{n,k} <: AbstractDecoratorManifold{ℝ}`

Kendall's shape space, defined as quotient of a `KendallsPreShapeSpace`

(represented by n×k matrices) by the action `ColumnwiseMultiplicationAction`

.

The space can be interpreted as tuples of $k$ points in $ℝ^n$ up to simultaneous translation and scaling and rotation of all points ^{[Kendall1984]}^{[Kendall1989]}.

This manifold possesses the `IsQuotientManifold`

trait.

**Constructor**

`KendallsShapeSpace(n::Int, k::Int)`

**References**

## Provided functions

`ManifoldsBase.check_point`

— Method`check_point(M::KendallsPreShapeSpace, p; atol=sqrt(max_eps(X, Y)), kwargs...)`

Check whether `p`

is a valid point on `KendallsPreShapeSpace`

, i.e. whether each row has zero mean. Other conditions are checked via embedding in `ArraySphere`

.

`ManifoldsBase.check_vector`

— Method`check_vector(M::KendallsPreShapeSpace, p, X; kwargs... )`

Check whether `X`

is a valid tangent vector on `KendallsPreShapeSpace`

, i.e. whether each row has zero mean. Other conditions are checked via embedding in `ArraySphere`

.

`ManifoldsBase.get_embedding`

— Method`get_embedding(M::KendallsPreShapeSpace)`

Return the space `KendallsPreShapeSpace`

`M`

is embedded in, i.e. `ArraySphere`

of matrices of the same shape.

`ManifoldsBase.manifold_dimension`

— Method`manifold_dimension(M::KendallsPreShapeSpace)`

Return the dimension of the `KendallsPreShapeSpace`

manifold `M`

. The dimension is given by $n(k - 1) - 1$.

`ManifoldsBase.project`

— Method`project(M::KendallsPreShapeSpace, p, X)`

Project tangent vector `X`

at point `p`

from the embedding to `KendallsPreShapeSpace`

by selecting the right element from the tangent space to orthogonal section representing the quotient manifold `M`

. See Section 3.7 of ^{[Srivastava2016]} for details.

**References**

`ManifoldsBase.project`

— Method`project(M::KendallsPreShapeSpace, p)`

Project point `p`

from the embedding to `KendallsPreShapeSpace`

by selecting the right element from the orthogonal section representing the quotient manifold `M`

. See Section 3.7 of ^{[Srivastava2016]} for details.

The method computes the mean of the landmarks and moves them to make their mean zero; afterwards the Frobenius norm of the landmarks (as a matrix) is normalised to fix the scaling.

`Base.exp`

— Method`exp(M::KendallsShapeSpace, p, X)`

Compute the exponential map on `KendallsShapeSpace`

`M`

. See ^{[Guigui2021]} for discussion about its computation.

`Base.log`

— Method`log(M::KendallsShapeSpace, p, q)`

Compute the logarithmic map on `KendallsShapeSpace`

`M`

. See the [`exp`

](@ref exp(::KendallsShapeSpace, ::Any, ::Any)onential map for more details

`Base.rand`

— Method`rand(::KendallsShapeSpace; vector_at=nothing)`

When `vector_at`

is `nothing`

, return a random point `x`

on the `KendallsShapeSpace`

manifold `M`

by generating a random point in the embedding.

When `vector_at`

is not `nothing`

, return a random vector from the tangent space with mean zero and standard deviation `σ`

.

`Manifolds.get_total_space`

— Method`get_total_space(::Grassmann{n,k})`

Return the total space of the `KendallsShapeSpace`

manifold, which is the `KendallsPreShapeSpace`

manifold.

`Manifolds.horizontal_component`

— Method`horizontal_component(::KendallsShapeSpace, p, X)`

Compute the horizontal component of tangent vector `X`

at `p`

on `KendallsShapeSpace`

`M`

. See ^{[Guigui2021]}, Section 2.3 for details.

`ManifoldsBase.get_embedding`

— Method`get_embedding(M::KendallsShapeSpace)`

Get the manifold in which `KendallsShapeSpace`

`M`

is embedded, i.e. `KendallsPreShapeSpace`

of matrices of the same shape.

`ManifoldsBase.is_flat`

— Method`is_flat(::KendallsShapeSpace)`

Return false. `KendallsShapeSpace`

is not a flat manifold.

`ManifoldsBase.manifold_dimension`

— Method`manifold_dimension(M::KendallsShapeSpace)`

Return the dimension of the `KendallsShapeSpace`

manifold `M`

. The dimension is given by $n(k - 1) - 1 - n(n - 1)/2$ in the typical case where $k \geq n+1$, and $(k + 1)(k - 2) / 2$ otherwise, unless $k$ is equal to 1, in which case the dimension is 0. See ^{[Kendall1984]} for a discussion of the over-dimensioned case.

- Kendall1989
D. G. Kendall, “A Survey of the Statistical Theory of Shape,” Statist. Sci., vol. 4, no. 2, pp. 87–99, May 1989 doi: 10.1214/ss/1177012582.

- Kendall1984
D. G. Kendall, “Shape Manifolds, Procrustean Metrics, and Complex Projective Spaces,” Bull. London Math. Soc., vol. 16, no. 2, pp. 81–121, Mar. 1984 doi: 10.1112/blms/16.2.81.

- Srivastava2016
A. Srivastava and E. P. Klassen, Functional and Shape Data Analysis. Springer New York, 2016. ISBN: 978-1-4939-4018-9. doi: 10.1007/978-1-4939-4020-2.

- Guigui2021
N. Guigui, E. Maignant, A. Trouvé, and X. Pennec, “Parallel Transport on Kendall Shape Spaces,” in Geometric Science of Information, Cham, 2021, pp. 103–110. doi: 10.1007/978-3-030-80209-7_12.