2016-09-15 15 views
6

z::Array{Complex128,1} değişkenini, gerçek ve karmaşık parçalar için iki diziye bölmem gerekiyor. Bunu yapmak bir yolu yeni değişkenler yapmak ::Array{Float64,1} ve eleman tarafından onlara elemanı doldurmaktır:Julia - Karmaşık dizinin gerçek parçasını edinin

for i = 1:size(z)[1] 
    ri[i] = z[i].re 
    ii[i] = z[i].im 
end 

nasılsa z ait atılımlar ve uzaklıklar manipüle gibi verileri kopyalama ilgili olmadığını bunu yapmanın bir yolu var mı?

cevap

7

Düzenleme: Özgün sürümde gereksiz bir reshape işlemi kullanıldı. @DNF yorumlarda belirtildiği gibi, bu gereksizdi. Cevap o zamandan beri revize edildi. kopyalama bir sorun değildir yaygın durumda

, sadece yap real(z) ve imag(z) (v0.6 içinde real.(z) ve imag.(z) değiştirildi). Benzer bir sorunu olan ancak kopyalamayı umursamayan gelecekteki okuyuculara yardımcı olmak için bunu ekliyorum.

Önerdiğiniz gibi, veri kopyalamaktan kaçınmak için z arasındaki adımları değiştirebilirsiniz. Basitçe

zfl = reinterpret(Float64, z) 
zre = @view zfl[1:2:end-1] 
zim = @view zfl[2:2:end] 

Kombine, biz hiçbir veri kopyalama (ayırmalar yığın-ayrılacak dizinin görünümleri nedeniyle ve çok az olduğu) olduğu gözlemliyoruz. Gördüğümüz gibi

julia> z = Vector{Complex128}(100000); 

julia> function reimvec(z) 
      zfl = reinterpret(Float64, z) 
      zre = @view zfl[1:2:end-1] 
      zim = @view zfl[2:2:end] 
      zre, zim 
     end 
reimvec (generic function with 1 method) 

julia> @time reimvec(z); 
    0.000005 seconds (9 allocations: 400 bytes) 

, perde arkasında böyle bir dizi strided edilir: En diziler çok büyük veya bu çok sıkı bir döngü içinde oluştuğunu olmadıkça

julia> strides(reimvec(z)[1]) 
(2,) 
, bu şimdiye belirtmeliyim
+4

olduğunu olduğunu Sizi çok fazla zaman kaybetmemek - veriyi kopyalamak modern CPU'larda çok hızlı. Ama bir kullanım durumu olabilir :) – StefanKarpinski

+1

* Yeniden şekillendirme işlemini bırakarak * marjinal * daha az tahsisi alabilirsiniz ve sadece döndürme görünümü (a, 1: 2: N), görünüm (a, 2: 2: N)) '. Ayrıca kodu küçük bir temizleyici yapar. Teyit eden bir 64 bayt kaydedebilirsiniz: D – DNF

+0

@DNF Teşekkürler! Güncellenmiş. –