# pdMean: Weighted Karcher mean of HPD matrices In pdSpecEst: An Analysis Toolbox for Hermitian Positive Definite Matrices

## Description

`pdMean` calculates an (approximate) weighted Karcher or Frechet mean of a sample of (d,d)-dimensional HPD matrices intrinsic to a user-specified metric. In the case of the affine-invariant Riemannian metric as detailed in e.g., \insertCiteB09pdSpecEst[Chapter 6] or \insertCitePFA05pdSpecEst, the weighted Karcher mean is either approximated via the fast recursive algorithm in \insertCiteH13pdSpecEst or computed via the slower, but more accurate, gradient descent algorithm in \insertCiteP06pdSpecEst. By default, the unweighted Karcher mean is computed.

## Usage

 ```1 2``` ```pdMean(M, w, metric = "Riemannian", grad_desc = FALSE, maxit = 1000, reltol) ```

## Arguments

 `M` a (d,d,S)-dimensional array corresponding to a sample of (d,d)-dimensional HPD matrices of size S. `w` an S-dimensional nonnegative weight vector, such that `sum(w) = 1`. `metric` the distance measure, one of `'Riemannian'`, `'logEuclidean'`, `'Cholesky'`, `'Euclidean'` or `'rootEuclidean'`. Defaults to `'Riemannian'`. `grad_desc` if `metric = "Riemannian"`, a logical value indicating if the gradient descent algorithm in \insertCiteP06pdSpecEst should be used, defaults to `FALSE`. `maxit` maximum number of iterations in gradient descent algorithm, only used if `grad_desc = TRUE` and `metric = "Riemannian"`. Defaults to `1000` `reltol` optional tolerance parameter in gradient descent algorithm, only used if `grad_desc = TRUE` and `metric = "Riemannian"`. Defaults to `1E-10`.

## Note

The function does not check for positive definiteness of the input matrices, and (depending on the specified metric) may fail if matrices are close to being singular.

## References

\insertAllCited

`Mid`, `pdMedian`
 ``` 1 2 3 4 5 6 7 8 9 10 11``` ```## Generate random sample of HPD matrices m <- function(){ X <- matrix(complex(real=rnorm(9), imaginary=rnorm(9)), nrow=3) t(Conj(X)) %*% X } M <- replicate(100, m()) z <- rnorm(100) ## Generate random weight vector w <- abs(z)/sum(abs(z)) ## Compute weighted (Riemannian) Karcher mean pdMean(M, w) ```