векторизовать это для цикла (текущая строка зависит от строки выше) - PullRequest
3 голосов
/ 23 января 2011

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

set.seed(123) <br> given.rand.matrix <- replicate(3,sign(rnorm(100))) <br> path <- matrix(NA,101,3) <br> path[1,] = c(10,20,30)</p> <p>for (j in 2:101) {<br> path[j,]<-path[j-1,]+given.rand.matrix[j-1,] <br> }

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

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

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

1 Ответ

6 голосов
/ 23 января 2011

Определенно векторизация: пропустите инициализацию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...