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

Julia: accumulating an array in a for loop (problem of local scope of loops)

我运行遇到了用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.[=19= 的每个值的唯一配置]

我 运行 遇到的问题是关于局部变量的范围——当我使用 vcat 时,我在循环的最内层得到一个 condition_list is not defined 错误。如果我不能使用数组累加,解决这个问题的最 Julian 方法是什么?或者也许有一些使用 push! 之类的解决方案?

此外,有没有一种方法可以在不执行我最后所做的愚蠢的“弹出第一行”操作的情况下累积数组?你能从一个零行、3 列的数组开始,然后在上面累积行吗?

第一个评论是,也许拥有一个惰性元组迭代器就足够了。在这种情况下,你写就足够了:

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 版本,或其他版本 post 1.0 版本) .

最后要注意的是:

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

是一个不正确的语法(您在行尾使用了 ) 而不是 ])。 此外,您还使用 , 而不是像我的代码中那样使用空格来分隔值,这会为您创建一个列向量(不是具有 1 行的矩阵,因为这是我猜您想要从使用 zeros 中得到什么功能)。

如果您对此代码有更多疑问,请在评论中提问。