Я пытаюсь перевести код из Matlab в R.

При необходимости: полный код Matlab можно посмотреть здесь, НАЧАЛО СТРОКИ 46, «Динамическое восприятие»: https://github.com/rssmith33/Active-Inference-Tutorial-Scripts/blob/main/Pencil_and_paper_exercise_solutions.m

ПРЕДПОСЫЛКИ, если необходимо: пример карандаша и бумаги для активного вывода (аналогичное прогнозирующее кодирование, по сути, это приблизительный байесовский вывод ...): https://psyarxiv.com/b4jm6/ на странице 135


МОЙ ВОПРОС:

Я новичок в этом, но я смог полностью воспроизвести математику (по сути, приблизительно байесовскую) сценария Matlab в R без выполнения цикла, теперь я хочу воспроизвести цикл.

В коде Matlab говорится:

>% observations = vectors!
o{1,1} = [1 0]';
o{1,2} = [0 0]';
o{2,1} = [1 0]';
o{2,2} = [1 0]';

В цикле Matlab это, например, говорит:

% likelihood
 lnAo = nat_log(A'*o{t,tau});

Таким образом, o {x, y} работает как индекс для верхнего вектора o {x, y} или, в моем случае: t (то есть временной шаг) и tau:

O {t, tau}, где t = временной шаг {1,} или {2,}, а tau - {, 1} или {, 2} верхнего o {,}

Для вычисления математики БЕЗ цикла я использовал их до сих пор:

# True observation at t-1
o11 = c(1, 0)   
o12 = c(0, 0)

# True observation at t-2
o21 = c(1, 0)       
o22= c(0, 1)   

# I used it for something like this, where I manually added the right o{x,y} to the formula.
st2all = ... ... +  ((log(t(A))%*%o22))    

Полагаю, я мог бы нацелить последний символ моего "o12" на tau, а второй последний - на t (время) и каким-то образом определить его, но как (и имеет ли это смысл)?

Или есть как-то элегантный эквивалент этой функции в R?

Заранее спасибо!

0
Steffen Schwerdtfeger 17 Сен 2021 в 16:29

2 ответа

Лучший ответ

Может быть, это что-то вроде структуры cell в Matlab

> o <- matrix(list(c(1, 0), c(0, 0), c(1, 0), c(1, 0)), 2, byrow = TRUE)

> o[[1, 1]]
[1] 1 0

> o[[1, 2]]
[1] 0 0

> o[[2, 1]]
[1] 1 0

> o[[2, 2]]
[1] 1 0
0
ThomasIsCoding 17 Сен 2021 в 13:50

Вы ищете способ вернуть значение o в зависимости от значений t и tau, чтобы вы могли легко поместить этот код в цикл? Если это так, вы можете определить функцию o(t, tau), которая возвращает значения, указанные в приведенном выше примере Matlab.

Обратите внимание , что t() - это функция транспонирования в R, поэтому я использую имя переменной timestep вместо t. Вы можете определить переменную с именем t, но тогда вы не сможете вызвать функцию, и похоже, что вам нужно будет транспонировать матрицы, чтобы преобразовать остальную часть вашего кода Matlab. .

Вот функция o(timestep, tau), которая дает желаемые результаты:

o <- function(timestep,tau){
  # default response is c(1,0)
  result <- c(1,0)
  # response is c(0,0) iff t==1 and tau ==2
  if (timestep == 1 & tau == 2) result <- c(0,0)
  
  return (result)
}

А вот упрощенный пример двух вложенных циклов, которые будут перебирать все комбинации 1 и 2 для timestep и tau, вызывая нашу функцию o() и выполняя простую демонстрационную математику:

# set up a starting value for demonstration
x <- c(1,1)

# loop over all values of 1 and 2 for t and tau
for(timestep in 1:2){
  for (tau in 1:2){

    # each iteration, call our function `o` and do some math
    x <- sqrt(x) + o(timestep,tau)
    
  }
}

Математика в ваших циклах, конечно, будет выглядеть иначе, потому что вы делаете более сложные вещи.

0
Christopher Belanger 17 Сен 2021 в 14:07