如何让嵌套for循环遍历所有排列(续篇)
嵌套循环实现全排列的索引设置问题
我之前用两层循环时,index <- 10*(i-1) + j能正常遍历所有组合,但扩展到三层循环时,索引计算出错——虽然能得到1000次计算结果,但无法覆盖所有排列。目前想掌握任意层数循环的索引设置方法,以下是我写的三层循环代码,其中索引部分明显错误:
iter = 10 #length of parameter ranges to test perm = 3 #how many parameters are being varied n_c <- 1 m_c <- 1 n_n <- 1 m_n <- 1 n_v <- 1 my_data_c <- vector("numeric", iter^perm) my_data_n <- vector("numeric", iter^perm) my_data_v <- vector("numeric", iter^perm) rho_c_store <- vector("numeric", iter) rho_n_store <- vector("numeric", iter) rho_v_store <- vector("numeric", iter) for (i in 1:iter) { # you can move this assignment to the outer loop rho_c <- (i / 10) x <- (rho_c * n_c)/m_c for (j in 1:iter) { rho_n <- (j / 10) y <- (rho_n * n_n)/m_n for (k in 1:iter){ rho_v <- (k / 10) z <- rho_v/n_v index <- iter*(i-2)+j+ k #Clearly where the error is rho_c_store[index] <- rho_c rho_n_store[index] <- rho_n rho_v_store[index] <- rho_v my_data_c[index] <- x my_data_n[index] <- y my_data_v[index] <- z } } } my_data <- cbind(rho_c_store, rho_n_store, rho_v_store, my_data_c, my_data_n,my_data_v) print(my_data)
问题分析与修正
- 索引计算错误:三层循环的索引需要基于「进制转换」逻辑分配权重:最外层循环的每个值对应
iter²个组合,中间层对应iter个组合,最内层对应1个组合。正确的索引公式为:index <- (i-1)*iter^2 + (j-1)*iter + k - 存储向量长度错误:
rho_c_store等向量当前长度设为iter(10),但实际需要存储iter^perm(1000)个值,会导致索引越界或值被覆盖,需调整长度。
修正后的代码:
iter = 10 # 参数测试范围的长度 perm = 3 # 待调整的参数数量 n_c <- 1 m_c <- 1 n_n <- 1 m_n <- 1 n_v <- 1 # 调整存储向量长度为总排列数 my_data_c <- vector("numeric", iter^perm) my_data_n <- vector("numeric", iter^perm) my_data_v <- vector("numeric", iter^perm) rho_c_store <- vector("numeric", iter^perm) rho_n_store <- vector("numeric", iter^perm) rho_v_store <- vector("numeric", iter^perm) for (i in 1:iter) { rho_c <- (i / 10) x <- (rho_c * n_c)/m_c for (j in 1:iter) { rho_n <- (j / 10) y <- (rho_n * n_n)/m_n for (k in 1:iter){ rho_v <- (k / 10) z <- rho_v/n_v # 修正后的索引计算 index <- (i-1)*iter^2 + (j-1)*iter + k rho_c_store[index] <- rho_c rho_n_store[index] <- rho_n rho_v_store[index] <- rho_v my_data_c[index] <- x my_data_n[index] <- y my_data_v[index] <- z } } } my_data <- cbind(rho_c_store, rho_n_store, rho_v_store, my_data_c, my_data_n, my_data_v) print(my_data)
任意层数的通用解决方案
如果需要支持任意数量的参数,手动写嵌套循环会非常繁琐,推荐用expand.grid自动生成所有参数的笛卡尔积,无需手动计算索引:
iter = 10 perm = 3 # 生成所有参数组合 params <- expand.grid( rho_c = seq(0.1, 1, by = 0.1), rho_n = seq(0.1, 1, by = 0.1), rho_v = seq(0.1, 1, by = 0.1) ) # 定义计算逻辑 n_c <- 1 m_c <- 1 n_n <- 1 m_n <- 1 n_v <- 1 params$my_data_c <- (params$rho_c * n_c)/m_c params$my_data_n <- (params$rho_n * n_n)/m_n params$my_data_v <- params$rho_v/n_v print(params)
这种方法不管参数数量是3还是更多,都能轻松处理,代码可读性和可维护性更强。
内容的提问来源于stack exchange,提问作者lmbradley
相关产品推荐
相关产品推荐

