我需要将变量拆分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?
编辑:原始版本使用了不必要的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)
| 归档时间: |
|
| 查看次数: |
1436 次 |
| 最近记录: |