You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让嵌套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)

问题分析与修正

  1. 索引计算错误:三层循环的索引需要基于「进制转换」逻辑分配权重:最外层循环的每个值对应iter²个组合,中间层对应iter个组合,最内层对应1个组合。正确的索引公式为:
    index <- (i-1)*iter^2 + (j-1)*iter + k
    
  2. 存储向量长度错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:31:50