使用循环在矩阵中存储值

时间:2016-03-24 00:39:36

标签: r matrix

我的代码是:

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,我的矩阵将全部为零,除了第一行,第七列和第七行,第一列中的一个。

任何关于如何做到这一点的想法将不胜感激! 感谢

2 个答案:

答案 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)