如何实现将N元UnitRange元组拆分为指定内外循环的函数f?
实现指定维度为内层循环的范围元组生成函数
现有一个长度为N的范围元组interestingranges(元素可为UnitRange或任意范围类型),需实现函数f,达成以下目标:
- 指定维度
idir对应的interestingranges[idir]作为最内层循环的范围,保持不变 - 其余维度按原顺序展开为可作为
CartesianIndices的集合,用于外层循环 - 最终生成的集合中,每个元素是一个元组:仅
idir维度保留原范围,其余维度均为单个数值,覆盖外层循环的所有组合
示例(N=3)
当interestingranges=(1:6, 1:5, 1:3)时:
f(interestingranges,1)生成集合:(1:6, 1, 1), (1:6, 2, 1), ... , (1:6, 5, 3)f(interestingranges,2)生成集合:(1, 1:5, 1), (2, 1:5, 1), ... , (6, 1:5, 3)f(interestingranges,3)生成集合:(1, 1, 1:3), (2, 1, 1:3), ... , (6, 5, 1:3)
实现代码(Julia)
function f(interestingranges::NTuple{N, AbstractRange}, idir::Int) where N # 提取内层循环范围和外层维度的范围集合 inner_range = interestingranges[idir] outer_ranges = Tuple(interestingranges[i] for i in 1:N if i != idir) # 生成外层所有笛卡尔组合索引 outer_indices = CartesianIndices(outer_ranges) # 遍历每个外层组合,构造目标元组 result = map(outer_indices) do idx new_tuple = Vector{Union{AbstractRange, Int}}(undef, N) new_tuple[idir] = inner_range outer_pos = 1 for i in 1:N if i != idir new_tuple[i] = idx[outer_pos] outer_pos += 1 end end Tuple(new_tuple) end return result end
代码逻辑说明
- 拆分范围:将指定维度的范围单独保留为内层循环范围,其余维度的范围组成新元组,用于生成外层循环的笛卡尔索引
- 生成外层组合:通过
CartesianIndices生成所有外层维度的数值组合索引 - 构造目标元组:对每个外层组合索引,创建对应元组——
idir位置放内层范围,其余位置替换为外层索引的对应数值,最终转成元组并收集所有结果
测试示例
# 测试用范围元组 ir = (1:6, 1:5, 1:3) # 验证结果 println(f(ir, 1)[1]) # 输出 (1:6, 1, 1) println(f(ir, 2)[end]) # 输出 (6, 1:5, 3) println(f(ir, 3)[5]) # 输出 (2, 1, 1:3)
内容的提问来源于stack exchange,提问作者TheWhitestOfFangs
相关产品推荐
相关产品推荐

