【发布时间】:2013-11-21 22:45:16
【问题描述】:
我有一个坐标向量,其中每一行指定一个圆的中心:
x <- runif(5,0,2)
y <- runif(5,0,2)
如您所见,圆心都在正方形 (0,2) 内。
每个圆的半径为 0.2。我想在原始圆的范围内随机移动圆的中心。我想我可以这样做:
radii <- (sample(20,5,replace=TRUE))/100
angles <- sample(360,5,replace=TRUE)
newx <- x + radii*(cos(angles))
newy <- y + radii*(sin(angles))
但是,我意识到这样做我可以从技术上获得落在正方形 (0,2) 之外的圆心。我可以尝试编写一个拒绝 newx 和 newy 负值的循环。但是必须为 10s 的数千行执行此操作并担心此速度。是否可以在不诉诸循环的情况下运行这种条件坐标移位?
我的规则集如下:
为每个圆心选择一个新的圆心。
新中心必须落在每个圆的区域内(距离原中心半径 0.2 距离)
新中心必须位于原来的正方形内。
如果一个圆心与圆的边界相交,则应按照反射定律反映(反映所选随机半径距离的剩余长度)
【问题讨论】:
-
这应该是某种随机游走吗?如果是这样,您应该首先决定在边界会发生什么。如果没有,为什么不直接做
X <- sapply(1:10,function(x) runif(5,0,2))之类的事情? -
谢谢@Roland,是的,它属于随机游走。如果原来的中心,我需要新的中心在半径范围内。
-
正如@Roland 所说,您应该提供确切的规则集。由于 R 的矢量化特性,您将不需要循环。例如,从博主关于估计 pi 的讨论中借用:
a <- runif(n,0,1); b <- runif(n,0,1); # use the pythagorean theorem; rads <- sqrt((a^2) + (b^2) )那么在您的限制范围内选择所有rads确实是最快的,例如rads<- rads[rads<0.2] -
如果是随机游走,您必须定义如果点移出正方形会发生什么。例如,您可以说它应该遵守反射的物理定律。我认为仅仅在模拟中说它不会发生是没有意义的。
-
是的,Roland 很抱歉需要保姆。反思的法则是我将如何被对待。
标签: r