将 "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 中是否有这个函数的优雅等价物?
提前致谢!
您是否正在寻找一种方法来根据 t
和 tau
的值来 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)
}
下面是两个嵌套循环的简化示例,它将针对 timestep
和 tau
迭代 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]]))
感谢大家的帮助!!
我正在尝试将一些代码从 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 中是否有这个函数的优雅等价物?
提前致谢!
您是否正在寻找一种方法来根据 t
和 tau
的值来 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)
}
下面是两个嵌套循环的简化示例,它将针对 timestep
和 tau
迭代 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]]))
感谢大家的帮助!!