2014-11-14 3 views
3

Я хочу создать случайную матрицу, которая должна быть симметричной.Как создать симметричную случайную матрицу?

Я попытался это:

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

, но это не обязательно симметричны.

Как я могу это сделать?

+0

Итак, создайте половину случайной матрицы и скопируйте ее на другую половину. –

+2

Что-то вроде 'm [lower.tri (m)] <- t (m) [lower.tri (m)]' довольно коротко. – qzr

ответ

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 <- 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

Спасибо, хорошая идея! :) –