【问题标题】:Combining many for loops into one将多个 for 循环合二为一
【发布时间】:2017-02-15 17:09:14
【问题描述】:

我正在处理一个问题,最初我需要使用嵌套的for 循环。我想知道是否有办法将大量 for 循环组合成一个。

此外,我找到了一个答案here,但它需要首先生成所有可能的组合,这在内存要求方面可能很糟糕。我的for 循环由许多相互独立的变量组成,用于评估成本函数,例如:

for x1 = 1:10
    for x2 = 2:15
        for x3 = 3:5
            for x4 = 7:9
                %and so on
                cost = J(x1, x2, x3, x4) %or more
            end
        end
    end
end

如果我提前知道我需要使用多少个变量,有没有办法让这个块更简单?

【问题讨论】:

  • 你可以优化一个循环取决于它做什么。如果有一种使嵌套循环成为一个单一循环的通用方法,那么一开始就不会有嵌套循环。另外,尽量避免不必要的格式化。
  • 添加到我之前的评论中。几乎所有的代码优化都依赖于内存和计算时间之间的弱平衡。一般来说,您需要选择一种,并注意另一种可能会变得更糟。
  • 另一种选择是修改 J() 以接受向量并返回一个 n-dim(n 是提供的变量的数量)张量,但这也回到了内存和时间之间的平衡。
  • 你可以用 Python 中的迭代器很好地做到这一点(保持低内存复杂度)——但据我所知,Matlab 中不存在等效结构。
  • @Florian Iterators 在这种情况下确实非常有用。

标签: matlab loops for-loop


【解决方案1】:

下面的函数可以完成这项工作,但它会比原始代码慢

function loop(f, args, varargin)
if ~isempty(args)
    for arg = args{1}
        loop(f, args(2:end), varargin{:}, arg);
    end
else
    f(varargin{:});
end

您可以开始计算

loop(@J, {1:10, 2:15, 3:5, 7:9});

【讨论】:

  • 这可能会使我的代码变慢,但这是一个非常巧妙的解决方案,因此我接受了这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 2012-06-04
  • 2020-11-17
  • 2021-10-08
  • 1970-01-01
相关资源
最近更新 更多