问题描述
考虑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
不使用。这些数组使用笛卡尔索引。