【发布时间】:2016-09-25 09:36:04
【问题描述】:
使用时序测试,我发现使用push! 增长Vector{Array{Float64}} 对象比简单地使用Array{Float64} 对象和hcat 或vcat 的性能要高得多。但是,计算完成后,我需要将生成的对象更改为Array{Float64} 以进行进一步分析。有没有一种不管尺寸如何都有效的方法?例如,如果我通过
Arrays 的Vector
u = [1 2 3 4
1 3 3 4
1 5 6 3
5 2 3 1]
uFull = Vector{Array{Int}}(0)
push!(uFull,u)
for i = 1:10000
push!(uFull,u)
end
我可以这样转换:
fill = Array{Int}(size(uFull)...,size(u)...)
for i in eachindex(uFull)
fill[i,:,:] = uFull[i]
end
但请注意,这要求我知道数组是矩阵(二维)。如果它是 3 维的,我需要另一个 :,因此这不适用于任意维度。
请注意,我还需要一种任意维度的“逆变换”形式(除了第一个由完整数组的最后一个索引索引),我目前有
filla = Vector{Array{Int}}(size(fill)[end])
for i in 1:size(fill)[end]
filla[i] = fill[:,:,i]'
end
我认为第一次转换的方法也可能解决第二次。
【问题讨论】:
-
我认为您首先需要
sizehint!,而不是来回切换Vector{Array{Float64}}和Array{Float64}。 docs.julialang.org/en/release-0.4/stdlib/collections/…! -
这实际上没有意义,因为使用数组向量会跳过连接到数组所需的大量复制。我认为不可能让它更快。以及如何将
sizehint!添加到数组中?例如,我试过uFull = u、sizehint!(uFull,100000)、for i = 1:100000uFull = hcat(uFull,u)end。 -
你确实复制了上面的例子两次。我建议你使用
sizehint!给 Vector{Float64} 预分配并使用push!或append!来增长它(意思是复制一次)。稍后您可以将其重塑为多维数组。 -
我必须测试一下哪个更快,因为我真的不能给出一个好的
sizehint! -
你为什么使用
Array{Int}而不给出尺寸?我认为这没有Array{Int,2}(对于二维数组)那么快(因为它没有完全参数化)
标签: arrays type-conversion julia