将 "functionalized index" 放入 R(MATlab 代码到 R)

Placing "functionalized index" in R (MATlab code to R)

我正在尝试将一些代码从 matlab 翻译成 R。

如有必要:可在此处查看完整的 matlab 代码,STARTIN LINE 46,“动态感知”:https://github.com/rssmith33/Active-Inference-Tutorial-Scripts/blob/main/Pencil_and_paper_exercise_solutions.m

背景知识(如有必要):主动推理的铅笔和纸示例(类似的预测编码,它本质上是近似贝叶斯推理...):https://psyarxiv.com/b4jm6/ 第 135 页


我的问题:

我对此很陌生,但我能够在不执行循环的情况下完全复制 R 中 matlab 脚本的数学(基本上近似贝叶斯),现在我想复制循环。

在 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 是上 o{ , }

的 {,1} 或 {,2}

到目前为止,为了不用循环计算数学,我使用了这些:

# 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 中是否有这个函数的优雅等价物?

提前致谢!

您是否正在寻找一种方法来根据 ttau 的值来 return o 的值,因此您可以轻松地将此代码放入一个循环?如果是这样,您可以定义一个函数 o(t, tau),该函数 return 是上面 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)
}

下面是两个嵌套循环的简化示例,它将针对 timesteptau 迭代 1 和 2 的所有组合,调用我们的函数 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)
    
  }
}

你的循环中的数学当然会看起来不同,因为你正在做更复杂的事情。

也许这类似于Matlab中的cell结构

> 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

我通过 https://www.latecnosfera.com/2016/05/matlab-cell-arrays-equivalent-in-r.html

弄明白了剩下的
o <- vector("list", length = 2 * 2)
dim(o) <- c(2, 2)
o

o[[1, 1]] <- c(1, 0)
o[[1, 2]] <- c(0, 0)
o[[2, 1]] <- c(1, 0)
o[[2, 2]] <- c(0, 1)

# This worked so far and the loop shouldn't be too much of a problem now I hope. :)
st2all2 = ..... +  ((log(t(A)+nzlog)%*%o[[2,2]])) 

感谢大家的帮助!!