R语言向量乘法双层循环批量生成向量运行失败问题咨询
R双层循环运行失败的原因及修复方案
错误原因
- for循环语法错误:R中for循环的迭代变量声明必须包裹在括号内,你写的
for x in 3:10{不符合语法要求,正确写法是for (x in 3:10) - 动态变量名调用错误:R不支持
b.[x]这种直接拼接变量名的写法,如果你要动态生成带数字后缀的独立变量,需要用assign()和get()函数完成赋值和调用,更推荐用列表统一存储所有b、c矩阵,后续索引调用更方便 - 索引逻辑错误:代码中
c.[x-1][,ncol(c.1)]存在逻辑问题,你所有c类矩阵都只有1列,直接取整列即可,不需要用ncol(c.1)写死索引 - 语法结构不完整:外层for循环的闭合大括号
}缺失,会触发语法报错
修复后的代码(推荐用列表存储)
# 初始数据定义 A = matrix(data= c(1, 2,3, 4, 5, 6, 7, 8, 9), nrow= 3, ncol= 3) B = matrix(data= c(6, 1, 3), nrow= 1, ncol = 3) C = matrix(data= c(5, 2, 2), nrow = 3, ncol= 1) # 用列表存储所有b、c矩阵,索引和你的编号一一对应 b_list <- list() c_list <- list() # 计算b.1、c.1 b_list[[1]] = matrix(data= NA, nrow = 1, ncol =ncol(A)) for (i in 1:ncol(B)) { b_list[[1]][1, i] =((A[,i]%*%C[,ncol(C)]/A[nrow(A),i] )) } c_list[[1]] <- matrix(data = NA , nrow = nrow(C) , 1) for (j in 1: nrow(C)) { c_list[[1]][j, 1] = (A[j,]%*%B[nrow(B),]/A[j,ncol(A)]) } # 计算b.2、c.2 b_list[[2]] <-matrix(data=NA, nrow= 1, ncol= ncol(A)) for (i in 1:ncol(A)) { b_list[[2]][1, i] = ((A[,i]%*%c_list[[1]][,ncol(c_list[[1]])]/A[nrow(A),i] )) } c_list[[2]] <- matrix(data= NA, nrow = nrow(C), ncol= 1) for (j in 1:nrow(C)) { c_list[[2]][j,1] = (A[j,]%*%b_list[[1]][nrow(b_list[[1]]),]/A[j,ncol(A)]) } # 批量生成3到10的结果 for (x in 3:10) { # 计算b.x b_list[[x]] <-matrix(data=NA, nrow= 1, ncol= ncol(A)) for (i in 1:ncol(A)) { b_list[[x]][1, i] = ((A[,i]%*%c_list[[x-1]][,1]/A[nrow(A),i] )) } # 计算c.x c_list[[x]] <- matrix(data= NA, nrow = nrow(C), ncol= 1) for (j in 1:nrow(C)) { c_list[[x]][j,1] = (A[j,]%*%b_list[[x-1]][1,]/A[j,ncol(A)]) } } # 调用方式:b_list[[3]]对应原来的b.3,c_list[[5]]对应原来的c.5
如果你确实需要生成b.1、c.1这种独立变量,可改用assign+get的方式实现:
for (x in 3:10) { # 生成b.x assign(paste0("b.",x), matrix(data=NA, nrow= 1, ncol= ncol(A))) b_cur <- get(paste0("b.",x)) c_pre <- get(paste0("c.",x-1)) for (i in 1:ncol(A)) { b_cur[1, i] = ((A[,i]%*%c_pre[,1]/A[nrow(A),i] )) } assign(paste0("b.",x), b_cur) # 生成c.x assign(paste0("c.",x), matrix(data= NA, nrow = nrow(C), ncol= 1)) c_cur <- get(paste0("c.",x)) b_pre <- get(paste0("b.",x-1)) for (j in 1:nrow(C)) { c_cur[j,1] = (A[j,]%*%b_pre[1,]/A[j,ncol(A)]) } assign(paste0("c.",x), c_cur) }
内容的提问来源于stack exchange,提问作者Alv_zen
相关产品推荐
相关产品推荐

