2016-03-24 45 views
0

我的代码存储在矩阵的值:使用循环

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

为什么要“除了第一行第七列和第七行第一列中的一个都是零”?是不是“除了第一行第七列中的所有零”都已经足够了? – adaien

+0

@adiana就这样对称 – Killian

+0

所以a应该总是与长度(y)相同? – adaien

回答

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来获得该行为。


如果我们有xa元件允许a != n那么我们必须决定如何各元素的索引中x映射到结果矩阵的索引。上述解决方案假定a == n并且两个索引域之间存在直接映射。

如果我们考虑的x元件以对应于导致矩阵索引1:n以循环方式,那么我们可以定义xi到是循环索引,取yii,即其中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 
+0

这太棒了,谢谢!如果我想为作业添加1而不是仅仅调用1,该怎么办?所以如果我有几百个,我可以看到有多少行/列 – Killian

+0

@Killian请参阅编辑。 – bgoldst

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 
    }}}