可以使用矢量调用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
来获得该行为。
如果我们有x
a
元件允许a != n
那么我们必须决定如何各元素的索引中x
映射到结果矩阵的索引。上述解决方案假定a == n
并且两个索引域之间存在直接映射。
如果我们考虑的x
元件以对应于导致矩阵索引1:n
以循环方式,那么我们可以定义xi
到是循环索引,取yi
如i
,即其中x
元件降落y
间隔指数。然后,我们可以汇总所有(xi,yi)
命中以产生每个单元格的计数。
如果你仍然需要对称性,那么我们可以进一步累积每个(yi,xi)
的计数,从而对每个击中的每个击打进行重复计数,每个击中两个对称细胞。
set.seed(1L); ## seed the PRNG for reproducible results
n <- 10L; ## length of y and result matrix dimensions
a <- 100L; ## length of x
y <- runif(n); ## produce random interval lengths
yb <- cumsum(c(0,y)); ## calculate interval boundaries
x <- runif(a,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
hit <- as.matrix(aggregate(n~xi+yi,cbind(xi=seq_len(n),yi=i,n=1),sum)); ## aggregate hits
m[hit[,c('xi','yi')]] <- m[hit[,c('xi','yi')]]+hit[,'n']; ## add n to xi,yi
m[hit[,c('yi','xi')]] <- m[hit[,c('yi','xi')]]+hit[,'n']; ## add n to yi,xi
m; ## print result
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 0 0 1 2 0 3 3 1 2 0
## [2,] 0 2 2 2 1 1 3 3 1 0
## [3,] 1 2 0 4 1 5 4 2 0 1
## [4,] 2 2 4 10 1 2 1 1 3 2
## [5,] 0 1 1 1 0 3 2 6 0 2
## [6,] 3 1 5 2 3 2 3 5 1 0
## [7,] 3 3 4 1 2 3 4 2 3 3
## [8,] 1 3 2 1 6 5 2 2 3 2
## [9,] 2 1 0 3 0 1 3 3 2 2
## [10,] 0 0 1 2 2 0 3 2 2 0
为什么要“除了第一行第七列和第七行第一列中的一个都是零”?是不是“除了第一行第七列中的所有零”都已经足够了? – adaien
@adiana就这样对称 – Killian
所以a应该总是与长度(y)相同? – adaien