Julia:在for循环中累积数组(循环局部范围的问题)

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

我遇到了使用for循环累积数组的问题(我的数组称为condition_list,并且每一行都存储唯一的参数配置。]

下面的代码是我在构建此数组时所想象的:

param1_vals = [1.0f0 2.0f0 3.0f0]; # specific values here don't matter
param2_vals = [1.0f0 2.0f0 3.0f0]; # specific values here don't matter
param3_vals = [1.0f0 2.0f0 3.0f0]; # specific values here don't matter

condition_list = zeros(Float32, 1, 3) # initialize condition_list

for ii = 1:length(param1_vals)
        for jj = 1:length(param2_vals)
                for kk = 1:length(param3_vals)
                        row_to_stack = [param1_vals[ii], param2_vals[jj], param3_vals[kk])
                        condition_list = vcat(condition_list, row_to_stack)
                end
         end
end

condition_list = condition_list[2:end,:] # pop off that first row (leftover of the initialization)

因此,结果condition_list的每一行都应具有param1_valsparam2_valsparam3_vals的每个值的唯一配置。

我遇到的问题与局部变量的范围有关–使用condition_list is not defined时,在循环的最内层出现vcat错误。如果我不能使用数组累加,最儒略式的方法来解决此问题是什么?还是有一些使用push!的解决方案?

而且,有没有一种方法可以累积一个数组而无需执行我最后做的愚蠢的'pop from first row?您可以从零行3列数组开始并在其上累积行吗?

arrays for-loop scope julia accumulate
1个回答
4
投票

第一个评论是,拥有一个懒惰的元组迭代器可能就足够了。在这种情况下,如果您编写:

res = Iterators.product(param1_vals, param2_vals, param3_vals)

但是,如果您确实需要矩阵,请在res上运行以下代码:

mapreduce(x -> hcat(x...), vcat, res)

现在,如果您真的想使用您在代码中所做的事情,我会使用:

condition_vec = Matrix{Float32}[]

for ii = 1:length(param1_vals)
        for jj = 1:length(param2_vals)
                for kk = 1:length(param3_vals)
                        row_to_stack = [param1_vals[ii] param2_vals[jj] param3_vals[kk]]
                        push!(condition_vec, row_to_stack)
                end
         end
end

condition_list = reduce(vcat, condition_vec)

但是,您可以简单地将这段代码过于复杂:

condition_vec = Matrix{Float32}[]
for p1 = param1_vals, p2 = param2_vals, p3 = param3_vals
    push!(condition_vec, [p1 p2 p3])
end
condition_list = reduce(vcat, condition_vec)

没有中间索引。

最后,由于condition_list是全局变量,因此您的代码无法正常工作,您必须编写:

global condition_list = vcat(condition_list, row_to_stack)

[使其生效(请注意,Julia即将进行更改,很快将不需要;此注释适用于Julia的当前1.4.2版本,或1.0版本之后的其他版本)。

最后注意:

row_to_stack = [param1_vals[ii], param2_vals[jj], param3_vals[kk])

是不正确的语法(您在行尾使用了)而不是])。另外,您不仅使用,,而且不使用代码中的空格来分隔将创建列向量的值(不是具有1行的矩阵,因为我想这是您使用zeros函数所要的)。 >

如果您对此代码还有其他疑问,请在评论中提问。

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