怎么处理不确定长度的结构体数组来提高效率

请问大家,在不确定结构体数组的长度的情况下,怎么处理能防止不断的push!操作导致速度越来越慢。

贴个代码? :yum:

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 个赞

我生成数据试了一下,但是发现这里又没有明显的变慢。本来上面的代码也是简化过的。我可能要仔细看一下问题在哪里。谢谢耐心回复。

本来也不是每次push就分配一次内存的,一般没必要考虑这个

https://github.com/JuliaLang/julia/issues/28588

没啥急事的话等这个修复

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!就行,效率很高。