[R] Flattening and unflattening symmetric matrices

Peter Ehlers ehlers at ucalgary.ca
Sat May 1 01:14:34 CEST 2010

On 2010-04-30 15:26, Nicholas Andrews wrote:
> Here's an easy question: I'd like to convert a symmetric matrix to a
> vector composed of the upper.tri() part of it plus the diagonal, and
> convert it back again.  What's the best way to achieve this?  I'm
> wondering if there are some built in functions to do this easily.  I
> can encode fine:
> v<- c(diag(A),A[upper.tri(A)])
> but I don't see an easy way to recover A from v without loops.  Any tips?

To (re)create a symmetric matrix, use A + t(A):
If vd is diag(A) part of v and vu is the rest of v, and
let's take A to be 4-by-4, then

  A <- matrix(0, 4, 4)
  A[upper.tri(A)] <- vu
  A <- A + t(A)
  diag(A) <- vd

  -Peter Ehlers

> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

Peter Ehlers
University of Calgary

More information about the R-help mailing list