For-loop,其中index不是从1或0开始,而是以30而不是1递增

问题描述 投票:0回答:1

我有以下内容:

include("as_mod.jl")

solvetimes = 50:200
timevector = Array{Float64}(undef,length(solvetimes))

for i in solvetimes
    global T
    T = i
    include("as_dat_large.jl")
    m, x, z = build_model(true,true)
    setsolver(m, GurobiSolver(MIPGap = 2e-2, TimeLimit = 3600))
    solve(m)

    timevector[i-49] = getsolvetime(m)
end

plot(solvetimes,log.(timevector),
title  = "solvetimes vs T", xlabel = "T", ylabel = "log(t)")

只要我的求解时间向量仅增加1,这就行得很好。但是,我对30增量感兴趣,然后它显然不起作用,因为我的时间向量超出界限。有没有办法解决这个问题?我阅读并尝试使用push!功能但无济于事。

如果我的问题不好,我很抱歉,但我不知道如何改进它。问题主要是关于for循环,其中索引不是从1开始并且仅以1递增到上限,而是非一个增量和一个不同于0或1的开始,如果这是有意义的。

julia
1个回答
4
投票

:50:200中的50:30:200语法在Julia中创建了一个范围对象。这些范围对象不仅可以迭代,而且还实现方法getindex,这意味着您可以使用a[index]语法简单地访问范围中的步骤,就像它是一个数组一样。

julia> solvetimes = 50:30:200 # 50, 80, 110, 140, ...
50:30:200

julia> solvetimes[3]
110

您可以通过多种方式解决问题。

首先,你可以引入一个itercount变量来计算迭代次数,并知道你将把解决时间放在timevector的哪个索引上。

solvetimes = 50:30:200 # increment by 30
timevector = Vector{Float64}(undef,length(solvetimes))

itercount = 1
for i in solvetimes
    ...

    timevector[itercount] = getsolvetime(m)
    global itercount
    itercount += 1
end

其他方式是创建一个空的timevectorpush!

solvetimes = 50:30:200 # increment by 30
timevector = Float64[] # an empty Float64 vector

for i in solvetimes
    ...

    push!(timevector, getsolvetime(m)) # push the value `getsolvetime(m)` into `timevector`
end

push!操作可能需要julia分配内存和复制数据以补偿增加的数组大小,因此可能效率不高,尽管它在您的问题中并不重要。

另一种方法是从1到lengthsolvetimes迭代。您的循环控制变量仍然逐个递增,但现在它代表solvetimes中的索引而不是时间点。

solvetimes = 50:30:200 # increment by 30
len = length(solvetimes)

timevector = Vector{Float64}(undef, len)

for i in 1:len
    global T
    T = solvetimes[i]
    ...

    timevector[i] = getsolvetime(m)
end

通过这些修改,k中的timevectorth值,timevector[k]代表solvetime[k]的求解时间。

您可能还会找到解决此问题的其他方法,例如使用Dicts等。

© www.soinside.com 2019 - 2024. All rights reserved.