我的代码是:
set.seed(100)
n <- 10
d <- rep(NA, n)
d[1] <- 0
y <- runif(n)
a <- 10
for (i in 2:length(y)) {
d[i] <- d[i-1] + y[i-1]
} #This creates an interval with endpoints at my y uniform RVs
store.x <- NULL
for (j in 1:a) {
x <- runif(1, min =0, max =sum(y))
for (i in 1:length(y)) {
if (x <= d[i+1] && x > d[i]) {
store.x[j] <- i
break
}
}
} #This tells you which interval my x uniform RV is in
现在,而不是store.x是一个向量,告诉我x落入的间隔,我希望它存储在矩阵的相应行和列中,值为1.所以对于我的第一个x,因为它落下进入区间7,我的矩阵将全部为零,除了第一行,第七列和第七行,第一列中的一个。
任何关于如何做到这一点的想法将不胜感激! 感谢
答案 0 :(得分:1)
store.x <- matrix(0,nrow=length(y),ncol=length(y))
for(j in 1:length(y)) {
x <- runif(1, min= 0, max =sum(y))
for(i in 1:length(y)) {
if(x <= d[i+1] && x > d[i]) {
store.x[j,i] <- 1
store.x[i,j] <- 1
break
}}}
答案 1 :(得分:1)
您可以使用对runif()
,cumsum()
和findInterval()
的矢量化调用更有效地实施此算法:
set.seed(1L); ## seed the PRNG for reproducible results
n <- 10L; ## length of x, y, and result matrix dimensions
y <- runif(n); ## produce random interval lengths
yb <- cumsum(c(0,y)); ## calculate interval boundaries
x <- runif(n,0,yb[length(yb)]); ## generate random x values
i <- findInterval(x,yb); ## find which intervals contain the x values
m <- matrix(0,n,n); ## init the result matrix
m[matrix(c(seq_len(n),i,i,seq_len(n)),ncol=2L)] <- 1; ## symmetric 1 assignment
m; ## print result
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 0 0 1 0 0 0 0 0 0 0
## [2,] 0 0 1 0 0 0 0 0 0 0
## [3,] 1 1 0 0 0 0 1 0 0 0
## [4,] 0 0 0 1 0 0 0 0 1 0
## [5,] 0 0 0 0 0 0 0 1 0 0
## [6,] 0 0 0 0 0 1 0 0 0 0
## [7,] 0 0 1 0 0 0 1 0 0 0
## [8,] 0 0 0 0 1 0 0 0 0 1
## [9,] 0 0 0 1 0 0 0 0 0 0
## [10,] 0 0 0 0 0 0 0 1 0 0
从技术上讲,你编写间隔测试x <= d[i+1] && x > d[i]
的方式意味着你希望左边界打开而右边界要关闭对于每个间隔。看起来findInterval()
最近才在其逻辑上添加了对此变体的支持,特别是在r69814
开发快照(最终将成为R-3.3.0
)中。所以你可能还没有访问它,但是当你这样做时,你可以通过left.open=T
来获得这种行为。
如果a
的{{1}}个元素允许x
,那么我们必须决定如何将a != n
中每个元素的索引映射到结果的索引矩阵。上述解决方案假定x
并且两个索引域之间存在直接映射。
如果我们认为a == n
的元素以循环方式对应于结果矩阵索引x
,那么我们可以将1:n
定义为循环索引,取{{1} } xi
,即yi
元素登陆的i
区间索引。然后,我们可以汇总所有y
次点击以生成每个单元格的计数。
如果您仍然需要对称性,那么我们可以进一步累计每个x
的计数,从而对每个命中重复计算一次,对于两个对称单元格中的每一个。
(xi,yi)