我遇到了使用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!
的解决方案?
而且,有没有一种方法可以累积一个数组而无需执行我最后做的愚蠢的'pop from first row?您可以从零行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版本,或1.0版本之后的其他版本)。
最后注意:
row_to_stack = [param1_vals[ii], param2_vals[jj], param3_vals[kk])
是不正确的语法(您在行尾使用了
)
而不是]
)。另外,您不仅使用,
,而且不使用代码中的空格来分隔将创建列向量的值(不是具有1行的矩阵,因为我想这是您使用zeros
函数所要的)。 >如果您对此代码还有其他疑问,请在评论中提问。