Представьте, что у меня есть функция, которая дает вероятность перехода из состояния {x, y} в состояние {X, Y}: transition <- function(x,y,X,Y)
Представьте, что значения x могут принимать значения в дискретномнабор точек x_grid
и y принимают дискретные значения в y_grid
, и я хотел бы вычислить все возможные переходы, например, заполнить в виде 2D-матрицы следующим образом:
X1Y1 X2Y1 X3Y1 X1Y2 .... X3Y3
x1,y1
x2,y1
x3,y1
x1,y2
x2,y2
x3,y2
...
x3,y3
Какой самый простой способперебрать мою функцию в R, чтобы сгенерировать эту матрицу?
Громоздкий подход с for
loop
x_grid <- 1:3
y_grid <- 1:3
## dummy function
transition <- function(x,y,X,Y)
x == X && y == Y
nx <- length(x_grid)
ny <- length(y_grid)
T <- matrix(NA, ncol = nx * ny, nrow = nx * ny)
for(i in 1:nx)
for(j in 1:ny)
for(k in 1:nx)
for(l in 1:ny)
T[i+(j-1)*ny, k+(l-1)*ny] <-
transition(x_grid[i], y_grid[j], x_grid[k], y_grid[l])
Конечно, есть более эффективный и более элегантный способ сделать это в R?
Например,
sapply(x_grid, function(x)
sapply(y_grid, function(y)
sapply(x_grid, function(X)
sapply(y_grid, function(Y)
transition(x,y,X,Y) ))))
работает более эффективно, но возвращает объект неправильной формы.Превращение внешнего применения в лапы, а затем выполнение cbind для его элементов исправляет это, но кажется очень грубым.