Skip to content

Symmetric matrix

5 messages · Megh Dal, Jorge Ivan Velez, Dimitris Rizopoulos +2 more

#
I have following matrix :

a = matrix(rnorm(36), 6)

Now I want to replace the lower-triangular elements with it's upper-triangular elements. That is I want to make a symmetric matrix from a. I have tried with lower.tri() and upper.tri() function, but got desired result. Can anyone please tell me how to do that?
#
try the following

a <- matrix(rnorm(36), 6)
ind <- lower.tri(a)
a[ind] <- t(a)[ind]
a


I hope it helps.

Best,
Dimitris
Megh Dal wrote:

  
    
#
Jorge Ivan Velez wrote:
If you look carefully, you'll see that it doesn't work! Dimitris had the 
better idea.
#
DR> try the following
    DR> a <- matrix(rnorm(36), 6)
    DR> ind <- lower.tri(a)
    DR> a[ind] <- t(a)[ind]
    DR> a

Yes, indeed, it needs the t(.) trick.

Note that 'Matrix' package has a function  forceSymmetric(.) to
do this for you (faster, using C code):

 A <- forceSymmetric(Matrix(rnorm(36), 6))

is all you'd need {if can afford to trash half of the random
       	     	  numbers generated}

Martin Maechler, ETH Zurich


    DR> I hope it helps.

    DR> Best,
    DR> Dimitris
DR> Megh Dal wrote:
>> I have following matrix :
    >> 
    >> a = matrix(rnorm(36), 6)
    >> 
    >> Now I want to replace the lower-triangular elements with it's upper-triangular elements. That is I want to make a symmetric matrix from a. I have tried with lower.tri() and upper.tri() function, but got desired result. Can anyone please tell me how to do that?