Learn R Programming

rotations (version 1.6.5)

weighted.mean: Weighted mean rotation

Description

Compute the weighted geometric or projected mean of a sample of rotations.

Usage

# S3 method for SO3
weighted.mean(
  x,
  w = NULL,
  type = "projected",
  epsilon = 1e-05,
  maxIter = 2000,
  ...
)

# S3 method for Q4 weighted.mean( x, w = NULL, type = "projected", epsilon = 1e-05, maxIter = 2000, ... )

Value

Weighted mean of the sample in the same parametrization.

Arguments

x

\(n\times p\) matrix where each row corresponds to a random rotation in matrix form (\(p=9\)) or quaternion (\(p=4\)) form.

w

vector of weights the same length as the number of rows in x giving the weights to use for elements of x. Default is NULL, which falls back to the usual mean function.

type

string indicating "projected" or "geometric" type mean estimator.

epsilon

stopping rule for the geometric method.

maxIter

maximum number of iterations allowed before returning most recent estimate.

...

only used for consistency with mean.default.

Details

This function takes a sample of 3D rotations (in matrix or quaternion form) and returns the weighted projected arithmetic mean \(\widehat{\bm S}_P\) or geometric mean \(\widehat{\bm S}_G\) according to the type option. For a sample of \(n\) rotations in matrix form \(\bm{R}_i\in SO(3), i=1,2,\dots,n\), the weighted mean is defined as $$\widehat{\bm{S}}=argmin_{\bm{S}\in SO(3)}\sum_{i=1}^nw_id^2(\bm{R}_i,\bm{S})$$ where \(d\) is the Riemannian or Euclidean distance. For more on the projected mean see moakher02 and for the geometric mean see manton04.

moakher02

See Also

median.SO3, mean.SO3, bayes.mean

Examples

Run this code
Rs <- ruars(20, rvmises, kappa = 0.01)

# Find the equal-weight projected mean
mean(Rs)

# Use the rotation misorientation angle as weight
wt <- abs(1 / mis.angle(Rs))
weighted.mean(Rs, wt)

rot.dist(mean(Rs))

# Usually much smaller than unweighted mean
rot.dist(weighted.mean(Rs, wt))

# Can do the same thing with quaternions
Qs <- as.Q4(Rs)
mean(Qs)
wt <- abs(1 / mis.angle(Qs))
weighted.mean(Qs, wt)
rot.dist(mean(Qs))
rot.dist(weighted.mean(Qs, wt))

Run the code above in your browser using DataLab