将MATLAB中基于Cell结构的循环转换为R语言的实现方法咨询
解决方案
1. 二维列表(等效MATLAB Cell数组)的定义验证
你原本的二维列表定义思路是完全正确的,仅需把维度赋值的写法简化即可,o[[t,tau]]的索引方式可以直接实现你需要的按t、tau取值的需求:
# 定义2x2二维列表,对应MATLAB的2x2 cell结构 o <- vector("list", length = 2 * 2) dim(o) <- c(2, 2) # 直接传入维度向量即可,无需套matrix # 按位置赋值列向量 o[[1,1]] <- matrix(c(1, 0), nrow = 2, ncol = 1) o[[1,2]] <- matrix(c(0, 0), nrow = 2, ncol = 1) o[[2,1]] <- matrix(c(1, 0), nrow = 2, ncol = 1) o[[2,2]] <- matrix(c(0, 1), nrow = 2, ncol = 1)
你可以执行print(o[[1,2]])验证取值,输出就是对应位置的[0,0]列向量。
2. 循环逻辑修正
你现有代码的核心问题出在循环的写法上:
length(Timesteps)的返回值是1(因为Timesteps是单个数值2),导致循环只会执行1次,应该改为1:Timesteps生成遍历的序列- 你嵌套了两层
t的循环,内层的t会覆盖外层的t取值,属于笔误,直接删除内层多余的t循环即可
修正后的循环框架如下:
Timesteps = 2 # 总时间步 Tau = 2 # 每个时间步的观测数量 qs <- matrix(nrow = 2, ncol = Timesteps) # 初始化后验分布存储矩阵 # 这里可以定义你需要的A、x等参数矩阵 A <- matrix(c(0.2, 0.8, 0.5, 0.5), nrow=2, ncol=2) # 示例A矩阵 for(t in 1:Timesteps){ qs[,t] = c(.5,.5) for (tau in 1:Tau){ # 对应MATLAB的nat_log(A'*o{t,tau}) # 注意R中矩阵转置用t(),矩阵乘法用%*%,自然对数用log() calc_res <- log(t(A) %*% o[[t, tau]]) # 你需要的其他计算逻辑写在这里 # 如果是矩阵乘法不要用*,*是元素级相乘,%*%才是矩阵乘法 y = x %*% o[[t,tau]] } }
内容的提问来源于stack exchange,提问作者Steffen Schwerdtfeger
相关产品推荐
相关产品推荐

