Julia多维数组遍历如何用单重for循环获取i、j、k等维度索引
三维数组场景实现
你可以直接用CartesianIndices配合元组解构,或者用Iterators.product生成索引组合,两种写法都和你原有的三层嵌套循环遍历顺序、性能完全一致:
写法1:基于CartesianIndices
for I in CartesianIndices(A) i, j, k = Tuple(I) # 此处可直接使用i,j,k,和原嵌套逻辑完全等价 # Do something with A[i+1,j,k], A[i,j+1,k], A[i,j,k+1], etc. end
写法2:基于Iterators.product
using Iterators for (i,j,k) in product(axes(A)...) # 直接解构得到各维度索引 # 后续逻辑和原嵌套写法无差异 end
错误原因说明
for (i,j,k) in axes(A):axes(A)返回的是各维度索引范围组成的元组(1:size(A,1), 1:size(A,2), 1:size(A,3)),迭代这个元组只会依次取出三个范围本身,而非所有索引的组合,自然得不到你要的遍历效果。for (i,j,k) in CartesianIndices(A):CartesianIndices迭代返回的是单个CartesianIndex对象,Julia刻意不支持直接对CartesianIndex做解构赋值,就是鼓励开发者直接用CartesianIndex本身做数组索引,减少冗余代码。
任意维度数组通用方案
对于N维数组,不需要手动指定每个维度的索引变量,直接使用CartesianIndex即可完成所有操作,性能和手动写N层嵌套循环完全一致:
for I in CartesianIndices(A) # 直接用I索引数组,等价于A[I[1], I[2], ..., I[N]] current_val = A[I] # 取第d维的索引:直接用I[d]即可,d从1开始计数 dim_3_index = I[3] # 取相邻元素也非常简便,比如获取第d维索引+1的元素: d = 2 next_dim_d_val = A[I + CartesianIndex(ntuple(x -> x == d ? 1 : 0, ndims(A)))] # 如果要把所有索引转为元组操作,也可以调用Tuple(I)得到所有维度索引的元组 all_indices = Tuple(I) end
内容的提问来源于stack exchange,提问作者Nathan Boyer
相关产品推荐
相关产品推荐

