循环使用函数的矩阵

时间:2013-12-19 21:02:32

标签: r loops matrix

我想在矩阵上执行此功能100次。我怎么能这样做?

v = 1
m <- matrix(0,10,10)

rad <- function(x) {
  idx <- sample(length(x), size=1)
  flip = sample(0:1,1,rep=T)
  if(flip == 1) {
    x[idx] <- x[idx] + v
    } else if(flip == 0) {
      x[idx] <- x[idx] - v 
      return(x)
}
}

这是我到目前为止所做的,但是不起作用。

for (i in 1:100) {
  rad(m)
}

我也试过这个,这似乎有用,但出于某种原因给了我5226行的输出。输出应该是10X10矩阵,根据函数的条件改变值。

reps <- unlist(lapply(seq_len(100), function(x) rad(m)))

3 个答案:

答案 0 :(得分:0)

当你运行rad(m)时,不会对m进行更改。 为什么? 它执行m矩阵的本地副本并在函数中处理它。当功能结束时它消失。 然后你需要保存什么函数返回。 正如@digEmAll所写的正确代码是:

for (i in 1:100) { 
    m <- rad(m) 
}

答案 1 :(得分:0)

好的,我想我明白了。

函数中的return语句只在if语句的一个分支内,因此它返回一个概率为~50%的矩阵,而在其他情况下它不会返回任何内容;你应该将代码函数改为:

rad <- function(x) {
  idx <- sample(length(x), size=1)
  flip = sample(0:1,1,rep=T)
  if(flip == 1) {
    x[idx] <- x[idx] + v
  } else if(flip == 0) {
      x[idx] <- x[idx] - v 
  }
  return(x)
}

然后你可以这样做:

for (i in 1:n) {
  m <- rad(m)
}

请注意,这在语义上等于:

for (i in 1:n) {
  tmp <- rad(m) # return a modified verion of m (m is not changed yet) 
                # and put it into tmp

  m <- tmp      # set m equal to tmp, then in the next iteration we will 
                # start from a modified m
}

答案 2 :(得分:0)

你在这里不需要循环。整个操作可以进行矢量化。

v <- 1
m <- matrix(0,10,10)


n <- 100 # number of random replacements

idx <- sample(length(m), n, replace = TRUE) # indices
flip <- sample(c(-1, 1), n, replace = TRUE) # subtract or add
newVal <- aggregate(v * flip ~ idx, FUN = sum) # calculate new values for indices
m[newVal[[1]]] <- m[newVal[[1]]] + newVal[[2]] # add new values