【发布时间】:2021-07-12 21:02:56
【问题描述】:
这是Interpolating literals into each expression in an array using a for loop 的后续问题。在那个问题中,我想在循环中插入表达式的一维数组(向量)。使用公认的答案:
julia> array_of_expr = Any[:(A * 5), :(B * 6 * T)]
julia> arglist = [:A; :B; :T]
julia> test_input = [1e5, 1e1, 100]
julia> @eval begin
function interpolate_1by1($(arglist...))
result_array = similar($array_of_expr)
$((quote
result_array[$i] = $(array_of_expr[i])
end for i in 1:length(array_of_expr))...)
return result_array
end
end
julia> interpolate_all(test_input...)
2-element Array{Float64,1}:
500000.0
6000.0
使用the accepted answer,假设我现在有一个表达式向量数组:
args = [:A, :B, :C]
args_typed = [:($s::Float64) for s in args]
big_expr_array = Array{Vector{Expr}}(undef, 3, 4)
big_expr_array[1, :] = [[:(A+B), :(C/A)], [:(B+1), :(A+C)], [:(B%5)], [:(C+7)]]
big_expr_array[2, :] = [[:(A*B+C), :(B*C+A)], [:(C/6), :(C+C)], [:(3*C)], [:(A%2)]]
big_expr_array[3, :] = [[:(A*C), :(A*B)], [:(A-6), :(B+C/A)], [:(B+2)], [:(C%3)]]
并希望在给定一些参数的情况下评估所有表达式,而不会丢失数组的整体结构。在我看来,我必须遍历数组中的 i 行、j 列和 k 元素(表达式向量)。
我尝试通过两种方式修改上一个问题的已接受答案,这两种方式都会产生错误:
@eval begin
function looped_eval1($(args_typed...))
result = similar($big_expr_array)
$( (quote
$( (quote
$( (quote
# i = row, j = vector, k = specific expression
result[$i, $j][$k] = $(big_expr_array[i, j][k])
end for k in 1:length(big_expr_array[i, j]))...
)
end for j in 1:size(big_expr_array)[2])...
)
end for i in 1:size(big_expr_array)[1])...
)
end
end
这会抛出UndefRefError: access to undefined reference。
第二:
@eval begin
function looped_eval2($(args_typed...))
result = similar($big_expr_array)
$( (quote (quote (quote
# i = row, j = vector, k = specific expression
result[$i, $j][$k] = $(big_expr_array[i, j][k])
end for k in 1:length(big_expr_array[i, j]))...
end for j in 1:size(big_expr_array)[2])...
end for i in 1:size(big_expr_array)[1])...
)
end
end
这会抛出syntax: "..." expression outside call around In[130]:5。
参数 A = 10、B = 20、C = 30 的示例期望结果:
big_expr_array[1, :] = [[30, 3], [21, 40], [0], [37]]
big_expr_array[2, :] = [[230, 610], [5, 60], [90], [0]]
big_expr_array[3, :] = [[300, 200], [4, 23], [22], [0]]
我应该如何编写手动循环展开以适应这些嵌套数组?或者,是否有更优雅的方式来实现对所有这些表达式的求值并保持相同的数组结构?
(代码也有可能正确分配给result——因为我卡在循环展开上,我不确定。)
【问题讨论】:
-
你能解释一下
for k in length(big_expr_array[i, j][k])这行吗,在定义之前你不能使用k -
我注意到 [k] 不应该在那里,我已经更正了错误并更新了原始问题,并进行了一些澄清和引发的实际错误。
-
你可以看看Unrolled.jl
标签: arrays julia metaprogramming