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
olduğunu olduğunu Sizi çok fazla zaman kaybetmemek - veriyi kopyalamak modern CPU'larda çok hızlı. Ama bir kullanım durumu olabilir :) – StefanKarpinski
* 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
@DNF Teşekkürler! Güncellenmiş. –