我需要将变量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
的步幅和偏移?
答案 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,)