2016-06-18 14 views
5

x::Vector{Vector{T}}'u bildirin. Her bir iç vektörün tüm öğeleri üzerinde (yani, T tipindeki tüm elemanlar) yinelemenin en iyi yolu nedir? Ben ile gelip en iyi tek hat gösterimi kullanılarak çift yineleme, yani geçerli:Diziler dizisi üzerinde yinelemenin en basit yolu nedir?

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

ama belki Iterators pakette, bu amaç için özel olarak tasarlanmış, tek yineleyici olup olmadığını merak ediyorum , Örneğin for i in some_iterator(x) ; x[i] ; end.

Daha genel olarak, herhangi bir dizi dizinin (yani, herhangi bir boyutun dizileri) en içteki elemanlarını yinelemeye ne dersiniz?

+1

Yineleyiciler paketini kullanma: 'zincirinde m (x ...) println (m); Sonu '. Verimli olmalı. –

+0

@DanGetz Ah, bu temiz! Çok teşekkürler. –

cevap

7

Yolunuz

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

oldukça hızlı. En iyi hız istiyorsanız, iki kez dereferencing kaçınır

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

kullanmak (ilk KQUEUE diziler değişken olduğu için dışarı optimize etmek zordur ve bu yüzden getindex saf değildir). Eğer m ve n gerekmiyorsa Alternatif olarak, sadece aynı zamanda hızlı

for y in x, for z in y 
    z 
end 

kullanabilirsiniz.

Sütun depolamasının önemsiz olduğunu unutmayın, çünkü buradaki tüm diziler tek boyutludur. Boyutların sayısı bir derleme zamanı sabiti ise,

  • boyutların sayısı, kullanım tekrarlama
  • sabit bir derleme zamanı değilse Base.Cartesian
  • bkz:

    genel soruya cevap vermek için

    using Iterators 
    for z in chain(x...) 
        z 
    end 
    
    : Dan Getz yorumunda belirtildiği gibi

Ve nihayet,

da çalışır. Ancak bunun bir miktar performans cezası var.

+0

"Getindex" ifadesi saf olmadığında - bunun ne anlama geldiğine dair biraz daha açıklayıcı olabilir misiniz? Teşekkürler! –

+0

Cevap verdiğin için teşekkürler - Bu cevaptan birkaç yeni şey öğrendim. @DanGetz, cevaba dahil etmek isteyebileceğiniz soru hakkındaki yorumlarda da düzgün bir yaklaşıma sahipti. Şerefe. –

+3

@aireties A [salt işlev] (https://en.wikipedia.org/wiki/Pure_function), aynı sonucu her zaman aynı sonucu veren ve herhangi bir yan etkisi olmayan bir işlevdir. Örneğin, sayılarda '+' saftır, çünkü '1 + 1' her zaman '2' olacaktır. Bir derleyici, bir işlevin saf olduğunu algılayabiliyorsa, tekrar tekrar hesaplanmasını engelleyebilir. Maalesef 'getindex' saf değildir, çünkü A [1] 'A' mutasyona uğramışsa farklı bir anlama gelebilir. Bu yüzden derleyicinin her zaman x [n] 'nin hesaplanması gerekmediğini anlaması çok zordur. –

İlgili konular