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_vals
、 param2_vals
和 param3_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
中得到什么功能)。
如果您对此代码有更多疑问,请在评论中提问。
我运行遇到了用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
.[=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
中得到什么功能)。
如果您对此代码有更多疑问,请在评论中提问。