我想在矩阵上执行此功能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)))
答案 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