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

Julia 朱莉娅:有没有办法返回索引中每个值的迭代器?,julia,Julia,考虑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 在多维数组的所有索引中循环最优雅的方法是什么?这不一定优雅,但它可以工作: for i in eachindex(view(m, 1:size(m)[1], 1:size(m)[2])) println(i) end Cartesi

考虑
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


在多维数组的所有索引中循环最优雅的方法是什么?

这不一定优雅,但它可以工作:

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)
原因是
数组
使用快速线性索引(范围
1:length(m)
),但并非所有数组都使用,尤其是
视图
不使用。那些数组使用笛卡尔指数。

那怎么办

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
的子索引元组)

我为什么不这样做呢
对于zip中的(i,j)(OneTo.(size(m))…)
我想您希望
i
成为
m
的实际索引。确切地说,
eachindex
返回的内容取决于您对它的调用,以及对它最有效的方式。对于
Array
,默认情况下这是
LinearIndices
。对于视图,它是
cartesianindice
。我认为编写
Tuple(I)
可能比编写
I.I
更好,因为访问字段依赖于类型的内部实现细节。如果实现发生变化,它可能会停止工作。哈,我知道!我首先尝试了
tuple(I)
(使用非大写
T
而不是类型的函数),但没有成功。谢谢你让我们知道。我相应地编辑了答案:)