Я хочу создать случайную матрицу, которая должна быть симметричной.Как создать симметричную случайную матрицу?
Я попытался это:
matrix(sample(0:1, 25, TRUE), 5, 5)
, но это не обязательно симметричны.
Как я могу это сделать?
Я хочу создать случайную матрицу, которая должна быть симметричной.Как создать симметричную случайную матрицу?
Я попытался это:
matrix(sample(0:1, 25, TRUE), 5, 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
Если вы не хотите использовать пакет:
n=3
x <- matrix(rnorm(n*n), n)
ind <- lower.tri(x)
x[ind] <- t(x)[ind]
x
Другой довольно интересная возможность основана на следующем математическом факте: если А некоторая матрица, то 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
Спасибо, хорошая идея! :) –
Итак, создайте половину случайной матрицы и скопируйте ее на другую половину. –
Что-то вроде 'm [lower.tri (m)] <- t (m) [lower.tri (m)]' довольно коротко. – qzr