2013-12-19 2 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

Когда вы запускаете рад (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 
Смежные вопросы