首页 > 解决方案 > Julia:在 for 循环中累积数组(循环局部范围的问题)

问题描述

我遇到了用 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_vals唯一param2_vals配置param3_vals

我遇到的问题是关于局部变量的范围——condition_list is not defined当使用vcat. 如果我不能使用数组累积,解决这个问题的最儒略的方法是什么?或者也许有一些解决方案使用push!或什么?

另外,有没有一种方法可以在不做我最后做的愚蠢的“弹出第一行”的事情的情况下积累一个数组?您可以从零行 3 列数组开始并在其上累积行吗?

标签: arraysfor-loopscopejuliaaccumulate

解决方案


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

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函数使用的要求)。

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


推荐阅读