朱莉娅:有没有办法返回每个索引值的迭代器?

问题描述

考虑m = [1 2 3; 4 5 6; 7 8 9]

for idx in eachindex(m)
  println(idx)
end

我希望它可以打印(1,1) (2,1),(3,1) .... (1,3),(2,3),但是它可以打印1,2,...,9

遍历多维数组所有索引的最优雅方法是什么?

解决方法

julia> for i in CartesianIndices(m)
           println(Tuple(i))
       end
(1,1)
(2,1)
(3,1)
(1,2)
(2,2)
(3,2)
(1,3)
(2,3)
(3,3)

(您可以使用i::CartseianIndex访问Tuple(i) sub 索引的元组。)

,

这不一定优雅,但可以:

for i in eachindex(view(m,1:size(m)[1],1:size(m)[2]))
       println(i)
end

CartesianIndex(1,1)
CartesianIndex(2,1)
CartesianIndex(3,1)
CartesianIndex(1,2)
CartesianIndex(2,2)
CartesianIndex(3,2)
CartesianIndex(1,3)
CartesianIndex(2,3)
CartesianIndex(3,3)

原因是Array使用快速线性索引(范围为1:length(m)),但并非所有数组都使用,特别是view不使用。这些数组使用笛卡尔索引。