用返回多个值的函数的矢量化调用替换 for 循环

Replace for loop with vectorized call of a function returning multiple values

我有以下函数:problema_firma_emprestimo(r,w,r_emprestimo,posicao,posicao_banco),其中所有输入都是标量。 此函数return三个不同的矩阵,使用
return demanda_k_emprestimo,demanda_l_emprestimo,lucro_emprestimo

我需要 运行 这个函数来获取存储在向量中的一系列 posicao_banco 值。 我正在使用 for 循环执行此操作,因为我需要三个单独的矩阵,每个矩阵都存储函数的三个输出之一,并且每个矩阵的第一维对应于 posicao_banco 的索引。我这部分的代码是:

demanda_k_emprestimo = zeros(num_bancos,na,ny);
demanda_l_emprestimo = similar(demanda_k_emprestimo);
lucro_emprestimo = similar(demanda_k_emprestimo);
for i in eachindex(posicao_bancos)
    demanda_k_emprestimo[i,:,:] , demanda_l_emprestimo[i,:,:] , lucro_emprestimo[i,:,:] = problema_firma_emprestimo(r,w,r_emprestimo[i],posicao,posicao_bancos[i]);
end
 

是否有使用向量化函数的快速、简洁的方法?像 problema_firma_emprestimo.(r,w,r_emprestimo[i],posicao,posicao_bancos) 这样的东西?当我这样做时,我得到了一个包含结果的元组,但我找不到解压答案的好方法。 谢谢!

不幸的是,在这里使用广播并不容易,因为那样你最终得到的输出是元组数组,而不是数组元组。我认为循环是一种非常好的方法,与广播相比没有性能损失。

不过,我建议您以不同方式组织输出数组维度,以便 i 索引到最后一个维度而不是第一个维度:

for i in eachindex(posicao_bancos)
    demanda_k_emprestimo[:, :, i] , ...
end

这是因为 Julia 数组是按列为主的,这样输出值以最有效的方式填充到输出数组中。您还可以考虑将输出数组制作成矩阵向量,而不是 3D 数组。

旁注:由于您正在(或应该)创建 MWE 是为了人们的回答,如果您使用更短且更容易混淆的变量名会更好。特别是对于不懂葡萄牙语的人(我猜),您的变量名超长,令人困惑并且使代码看起来很密集。很难一眼看出 demanda_k_emprestimodemanda_l_emprestimo 之间的区别。变量的含义也不重要,所以最好只称它们为 ABXY,函数 foo 或东西。