2014-11-14 152 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