2016-09-15 9 views
6

変数z::Array{Complex128,1}を実数部と複素数部の2つの配列に分割する必要があります。これを行う一つの方法は、新しい変数を作成し::Array{Float64,1}と要素によってそれらに要素を満たすことである。Julia - 複雑な配列の実数部を得る

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

何とかzの進歩とオフセットを操作するように、データをコピー伴わないこれを行う方法はありますか?

答えて

7

編集:元のバージョンでは、不要な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,) 
+4

私はあなたの配列は非常に大きなか、これは非常にタイトなループ内で発生している場合を除き、これがあることを言及する必要がありますあまりにも多くの時間を節約することはまずありません。最新のCPUではデータのコピーが非常に高速です。しかし、ユースケースがあるかもしれません:) – StefanKarpinski

+1

'reshape'操作を削除して' view(a、1:2:N)、view(a、2:2:N)を返すだけで、 ) '。また、コードを少しきれいにします。あなたは64バイトのワープロを保存することができます:D – DNF

+0

@DNFありがとう!更新しました。 –

関連する問題