-
Notifications
You must be signed in to change notification settings - Fork 53
/
SymmetricPositiveDefiniteLogEuclidean.jl
37 lines (30 loc) · 1.24 KB
/
SymmetricPositiveDefiniteLogEuclidean.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@doc raw"""
LogEuclideanMetric <: RiemannianMetric
The LogEuclidean Metric consists of the Euclidean metric applied to all elements after mapping them
into the Lie Algebra, i.e. performing a matrix logarithm beforehand.
"""
struct LogEuclideanMetric <: RiemannianMetric end
@doc raw"""
distance(M::MetricManifold{SymmetricPositiveDefinite{N},LogEuclideanMetric}, p, q)
Compute the distance on the [`SymmetricPositiveDefinite`](@ref) manifold between
`p` and `q` as a [`MetricManifold`](@ref) with [`LogEuclideanMetric`](@ref).
The formula reads
```math
d_{\mathcal P(n)}(p,q) = \lVert \operatorname{Log} p - \operatorname{Log} q \rVert_{\mathrm{F}}
```
where $\operatorname{Log}$ denotes the matrix logarithm and
$\lVert\cdot\rVert_{\mathrm{F}}$ denotes the matrix Frobenius norm.
"""
function distance(
::MetricManifold{ℝ,SymmetricPositiveDefinite{N},LogEuclideanMetric},
p,
q,
) where {N}
return norm(log(Symmetric(p)) - log(Symmetric(q)))
end
"""
is_flat(::MetricManifold{ℝ,<:SymmetricPositiveDefinite,LogEuclideanMetric})
Return false. [`SymmetricPositiveDefinite`](@ref) with [`LogEuclideanMetric`](@ref)
is not a flat manifold.
"""
is_flat(M::MetricManifold{ℝ,<:SymmetricPositiveDefinite,LogEuclideanMetric}) = false