編集:元のバージョンでは、不要なreshape
操作を使用していました。コメントに@DNFが指摘したように、それは不必要でした。それ以来、答えは改訂されました。
コピーが問題ではない一般的なケースでは、real(z)
とimag(z)
(v0.6ではreal.(z)
とimag.(z)
に名前が変更されました)を実行します。私はこれを含めて、似たような問題を抱えているがコピーを気にしない将来の読者を助ける。
データのコピーを避けるために、ストライドz
を操作することができます。組み合わせるだけで
zfl = reinterpret(Float64, z)
zre = @view zfl[1:2:end-1]
zim = @view zfl[2:2:end]
、我々はデータのコピーが(割り当てはヒープ割り当てられた配列の見解によるものであり、かつ最小限である)がないことを確認します。 、舞台裏で、このような配列がストライドさ
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)
我々が見ることができるように:
julia> strides(reimvec(z)[1])
(2,)
私はあなたの配列は非常に大きなか、これは非常にタイトなループ内で発生している場合を除き、これがあることを言及する必要がありますあまりにも多くの時間を節約することはまずありません。最新のCPUではデータのコピーが非常に高速です。しかし、ユースケースがあるかもしれません:) – StefanKarpinski
'reshape'操作を削除して' view(a、1:2:N)、view(a、2:2:N)を返すだけで、 ) '。また、コードを少しきれいにします。あなたは64バイトのワープロを保存することができます:D – DNF
@DNFありがとう!更新しました。 –