朱莉娅 - 获得复杂数组的真实部分

时间:2016-09-15 14:18:07

标签: arrays julia

我需要将变量z::Array{Complex128,1}拆分为两个数组,用于实部和复杂部分。一种方法是创建新变量::Array{Float64,1}并逐个元素填充它们:

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

有没有办法做到这一点,不涉及复制数据,比如以某种方式操纵z的步幅和偏移?

1 个答案:

答案 0 :(得分: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,)