2014-11-14 195 views
3

我想生成一個應該是對稱的隨機矩陣。如何生成對稱隨機矩陣?

我已經試過這樣:

matrix(sample(0:1, 25, TRUE), 5, 5) 

,但它不一定是對稱的。

我該怎麼做?

+0

因此,生成一半隨機矩陣並將其複製到另一半。 – 2014-11-14 19:17:05

+2

類似'm [lower.tri(m)] < - t(m)[lower.tri(m)]'很短。 – qzr 2014-11-14 19:36:00

回答

5

Matrix

library(Matrix) 
x<-Matrix(rnorm(9),3) 
x 
3 x 3 Matrix of class "dgeMatrix" 
      [,1]  [,2]  [,3] 
[1,] -0.9873338 0.8965887 -0.6041742 
[2,] -0.3729662 -0.5882091 -0.2383262 
[3,] 2.1263985 -0.3550972 0.1067264 

X<-forceSymmetric(x) 
X 
3 x 3 Matrix of class "dsyMatrix" 
      [,1]  [,2]  [,3] 
[1,] -0.9873338 0.8965887 -0.6041742 
[2,] 0.8965887 -0.5882091 -0.2383262 
[3,] -0.6041742 -0.2383262 0.1067264 
3

試試這個如果你不想使用包:

n=3 
x <- matrix(rnorm(n*n), n) 
ind <- lower.tri(x) 
x[ind] <- t(x)[ind] 
x 
4

另一個很有趣的機會,是基於以下的數學事實:如果A一些矩陣,那麼A乘以它的轉置總是對稱的。

> A <- matrix(runif(25), 5, 5) 
> A %*% t(A) 
     [,1]  [,2]  [,3]  [,4]  [,5] 
[1,] 1.727769 1.0337816 1.2195505 1.4661507 1.1041355 
[2,] 1.033782 1.0037048 0.7368944 0.9073632 0.7643080 
[3,] 1.219551 0.7368944 1.8383986 1.3309980 0.9867812 
[4,] 1.466151 0.9073632 1.3309980 1.3845322 1.0034140 
[5,] 1.104135 0.7643080 0.9867812 1.0034140 0.9376534 
+0

謝謝,好主意! :) – 2014-11-17 10:57:47