考虑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), (3, 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)
(您可以使用Tuple(i)
访问i::CartseianIndex
的子索引的元组。(
这不一定很优雅,但它很有效:
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
不使用。这些数组使用笛卡尔索引。