2013-12-19 97 views
-1

我想在矩陣上執行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

'for(i in 1:100){m < - rad(m)}'? – digEmAll

+0

這似乎只產生1次運行,而不是100 – user3067923

+0

我不明白你想獲得什麼... 100個矩陣的列表? – digEmAll

回答

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

這更接近最終答案,但輸出是一堆不同的矩陣。 最終輸出應該是用新值更新單個矩陣,而不是每次迭代創建一個新矩陣。 – user3067923

+0

@ user3067923:請檢查我的編輯 – digEmAll

+0

謝謝這就是我需要的! – user3067923

0

當你運行rad(m)不是對m做改變。 爲什麼? 它做一個m矩陣的本地副本並在其中進行處理。當函數結束時消失。 然後你需要保存什麼函數返回。 作爲@digEmAll寫正確的代碼是:

for (i in 1:100) { 
    m <- rad(m) 
} 
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