迭代数组数组的最简单方法是什么?

时间:2016-06-18 23:55:30

标签: julia

x::Vector{Vector{T}}。迭代每个内部向量的所有元素(即T类型的所有元素)的最佳方法是什么?我能想到的最好的是使用单行表示法的双重迭代,即:

for n in eachindex(x), m in eachindex(x[n])
    x[n][m]
end

但是我想知道是否有一个迭代器,可能在Iterators包中,专门为此目的而设计,例如: for i in some_iterator(x) ; x[i] ; end

更一般地说,如何迭代任何数组数组的最内层元素(即任何维度的数组)?

1 个答案:

答案 0 :(得分:8)

你的方式

for n in eachindex(x), m in eachindex(x[n])
    x[n][m]
end

非常快。如果您想要最佳速度,请使用

for n in eachindex(x)
    y = x[n]
    for m in eachindex(y)
        y[m]
    end
end

避免了两次解除引用(第一次取消引用很难优化,因为数组是可变的,因此getindex不纯粹)。或者,如果您不需要mn,则可以使用

for y in x, for z in y
    z
end

这也很快。

请注意,列主存储是无关紧要的,因为此处的所有数组都是一维的。

回答你的一般问题:

  • 如果维度数是编译时常量,请参阅Base.Cartesian
  • 如果维度数不是编译时常量,请使用递归

最后,正如Dan Getz在评论中提到的那样:

using Iterators
for z in chain(x...)
    z
end

也有效。然而,这有点性能损失。