请问大家,在不确定结构体数组的长度的情况下,怎么处理能防止不断的push!
操作导致速度越来越慢。
贴个代码?
1 个赞
贴个代码吧,我最近很闲
mutable struct NAD_PASS
nad :: Array{Float64,2}
end
function find_pass(sat_height::Vector{NAD_PASS},
AOI::Vector{Float64})::Vector{NAD_PASS}
sat_height_new=Vector{NAD_PASS}()
@inbounds for file in sat_height
flag1=findall(x->AOI[1]-1< x <AOI[2]+1,file.nad[:,1])
flag2=findall(x->AOI[3]-1< x <AOI[4]+1,file.nad[:,2])
flag=intersect(flag1,flag2)
if !isempty(flag)
temp=NAD_PASS(file.nad[flag[1]:flag[end],:])
sat_height_new=[sat_height_new;temp] # *
else
continue
end
end
sat_height_new
end
差不多就是这样,*
的地方在不断合并的过程中会越来越慢。而且我觉得结构体是比较适合的,不打算换数据结构。大家有什么建议吗
给个例子吧,没有测试的数据我也很难办啊。
输入数据是结构体数组,我不知道怎么弄上来让大家分析。只是一少部分数据的话,不能明显看出变慢。
你再写个生成随机数据的函数吧,主要我也不知道你实际数据长什么样,也不好自己写生成随机的。主要就是sat_height::Vector{NAD_PASS}
和 AOI::Vector{Float64}
, 生成之后最好自己跑一下,觉得可以代表你的真实数据就行,(记得固定随机数种子),也可以传 Github.
1 个赞
我生成数据试了一下,但是发现这里又没有明显的变慢。本来上面的代码也是简化过的。我可能要仔细看一下问题在哪里。谢谢耐心回复。
明白了。谢谢您,谢谢大家回复
补一个自己写的随机生成数据的代码吧,如果不发出来直接删了觉得挺可惜的。
using Statistics
using Random
Random.seed!(5);
n=100;
m=500; # n 和 m 随意设置
nad=100*rand(Float64,(n,2))
AOI=ones(Float64,4)
AOI[1]=quantile(nad[:,1],0.4)
AOI[2]=quantile(nad[:,1],0.6)
AOI[3]=quantile(nad[:,2],0.4)
AOI[4]=quantile(nad[:,2],0.6)
sat_height=[NAD_PASS(100*rand(Float64,(n,2))) for i in 1:m]
直接Vector向量push!就行,效率很高。