2011-01-22 4 views
3

Предположим, что я хочу создать n = 3 пути случайного блуждания (длина пути = 100) с заданной матрицей (100x3) плюс/минус. Первый путь начнется в 10, второй в 20, третий на 30:векторизовать это для цикла (текущая строка зависит от строки выше)

set.seed(123)
given.rand.matrix <- replicate(3,sign(rnorm(100)))
path <- matrix(NA,101,3)
path[1,] = c(10,20,30)

for (j in 2:101) {
  path[j,]<-path[j-1,]+given.rand.matrix[j-1,]
}

Конечные значения (с учетом семян и Rand матрица) 14, 6, 34 ..., который является желаемый результат ... но ...

Вопрос: Есть ли способ векторизации цикла for? Проблема заключается в том, что при вычислении матрица пути еще не заполнена полностью. Таким образом, замена петли на path[2:101,]<-path[1:100,]+given.rand.matrix возвращает в основном NA. Я просто хочу знать, можно ли избежать этого типа цикла в R.

Большое спасибо заранее.

+0

похож недавно [нить] (http://stackoverflow.com/questions/4695224/is-it-possible- to-vectorise-the-sequential-update-of-the-the-elements-of-a-vector-in) – VitoshKa

ответ

6

Определенно распараллеливаемые: Пропустить инициализацию path, и использовать cumsum над матрицей:

path <- apply(rbind(c(10,20,30),given.rand.matrix), 2, cumsum) 

> head(path) 
    [,1] [,2] [,3] 
[1,] 10 20 30 
[2,] 9 19 31 
[3,] 8 20 32 
[4,] 9 19 31 
[5,] 10 18 32 
[6,] 11 17 31 
> tail(path) 
     [,1] [,2] [,3] 
[96,] 15 7 31 
[97,] 14 8 32 
[98,] 15 9 33 
[99,] 16 8 32 
[100,] 15 7 33 
[101,] 14 6 34 
+0

Да. Спасибо за быстрый ответ. Хотя фактическая проблема, которую я пытаюсь решить, немного сложнее, чем то, что я опубликовал, ваш ответ указал мне на возможность того, что ответ, который я ищу, лежит в семействе функций. checkmark – morsecode

+0

Имейте в виду, что apply() не векторизован, но он более симпатичный, чем цикл. То, что действительно делает код Прасада быстрым, - это функция cumsum(), которая векторизована. Поэтому используйте apply(), но будьте уверены и примените векторизованные функции, чтобы быть быстрыми. –

Смежные вопросы