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

Mat*_*ord 7 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
Run Code Online (Sandbox Code Playgroud)

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

Fen*_*ang 8

编辑:原始版本使用了不必要的reshape操作.正如@DNF在评论中指出的那样,这是不必要的.答案已经修改过了.

在复制不是问题的常见情况下,只需执行real(z)imag(z)(重命名real.(z)imag.(z)在v0.6中).我将其包括在内,以帮助那些有类似问题,但可能不关心复制的未来读者.

如您所知,您可以操纵步幅z以避免复制数据.只是

zfl = reinterpret(Float64, z)
zre = @view zfl[1:2:end-1]
zim = @view zfl[2:2:end]
Run Code Online (Sandbox Code Playgroud)

结合起来,我们观察到没有数据复制(分配是由于堆分配的数组视图,并且是最小的).

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)
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,在幕后,这样一个阵列是跨步的:

julia> strides(reimvec(z)[1])
(2,)
Run Code Online (Sandbox Code Playgroud)

  • 我应该提一下,除非您的阵列非常大或者这是在一个非常紧凑的循环中发生,否则这不太可能为您节省太多时间 - 在现代CPU上复制数据的速度非常快.但是可能有一个用例:) (4认同)