R 是否有用于在多维空间中生成随机数的包?例如,假设我想在长方体或球体内生成 1000 个点。
最佳答案
我有一些用于超立方体和 n 球体选择的函数,它们生成具有笛卡尔坐标的数据帧,并保证通过超立方体或 n 球体的任意维度的均匀分布:
GenerateCubiclePoints <- function(nrPoints,nrDim,center=rep(0,nrDim),l=1){
x <- matrix(runif(nrPoints*nrDim,-1,1),ncol=nrDim)
x <- as.data.frame(
t(apply(x*(l/2),1,'+',center))
)
names(x) <- make.names(seq_len(nrDim))
x
}
位于
nrDim
的立方体/超立方体中带有 center
的尺寸和 l
一侧的长度。对于具有
nrDim
的 n 球体维度,你可以做类似的事情,其中 r
是半径:GenerateSpherePoints <- function(nrPoints,nrDim,center=rep(0,nrDim),r=1){
#generate the polar coordinates!
x <- matrix(runif(nrPoints*nrDim,-pi,pi),ncol=nrDim)
x[,nrDim] <- x[,nrDim]/2
#recalculate them to cartesians
sin.x <- sin(x)
cos.x <- cos(x)
cos.x[,nrDim] <- 1 # see the formula for n.spheres
y <- sapply(1:nrDim, function(i){
if(i==1){
cos.x[,1]
} else {
cos.x[,i]*apply(sin.x[,1:(i-1),drop=F],1,prod)
}
})*sqrt(runif(nrPoints,0,r^2))
y <- as.data.frame(
t(apply(y,1,'+',center))
)
names(y) <- make.names(seq_len(nrDim))
y
}
在二维中,这些给出:
从代码:
T1 <- GenerateCubiclePoints(10000,2,c(4,3),5)
T2 <- GenerateSpherePoints(10000,2,c(-5,3),2)
op <- par(mfrow=c(1,2))
plot(T1)
plot(T2)
par(op)
关于r - 生成多维数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5016806/