# [R] how to convert the lower triangle of a matrix to a symmetric matrix

Charles C. Berry cberry at tajo.ucsd.edu
Fri Apr 20 05:53:38 CEST 2007

```On Thu, 19 Apr 2007, Ranjan Maitra wrote:

> Hi,
>
> I have a vector of p*(p+1)/2 elements, essentially the lower triangle of
> a symmetric matrix. I was wondering if there is an easy way to make it
> fill a symmetric matrix. I have to do it several times, hence some
> efficient approach would be very useful.

It depends on what the ordering of elements in your vector is.

Many programs will order those elements (1,1), (2,1), (2,2), (3,1) , ...

In which case this shows how:

> k.given.i.j <- function(x , y ) ifelse( y<x, x*(x-1)/2 + y, y*(y-1)/2 + x )
> k.mat <- function(p) outer( 1:p, 1:p, k.given.i.j )
> k.mat( 3 )
[,1] [,2] [,3]
[1,]    1    2    4
[2,]    2    3    5
[3,]    4    5    6
> matrix( rnorm( choose(4,2) )[ k.mat( 3 ) ] , nr = 3 )
[,1]        [,2]        [,3]
[1,] -1.2165313  0.28262740  0.62448849
[2,]  0.2826274 -1.19842868  0.05676263
[3,]  0.6244885  0.05676263 -1.80957190
>

For efficiency, you might save and reuse the result of k.mat().

If the elements are ordered (1,1), (2,1), (3,1), ..., you will need to
write your own version of k.given.i.j()

>
> Many thanks and best wishes,
> Ranjan
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help