【问题标题】:avoiding nested for loops in MATLAB避免 MATLAB 中的嵌套 for 循环
【发布时间】:2015-01-24 03:49:09
【问题描述】:

我在 MATLAB 中有一个场景,我想针对某些参数值评估函数。参数是从任意数量的数组中提取的,每个数组可以有任意数量的元素。在调用函数之前,我知道数组的数量和其中的元素数量。

例如,假设我有数组 A = [a1 a2 ... aL]B = [b1 b2 ... bM]C = [c1 c2 ... cN]

for i = 1:length(A)
    for j = 1:length(B)
        for k = 1:length(C)
            myfunc(A(i), B(j), C(k))
        end
     end
end

我正在考虑采用AL 元素、BM 元素和CN 元素,并将它们展平成一个单元格数组,并使用单个for 循环进行迭代在这个元胞数组上。

我想知道是否有一个 MATLAB 函数可以做这样的事情......结果不一定是元胞数组。我想要一种方法来避免有多个嵌套的 for 循环。对于少量循环来说很好,但是随着这个数量的增长,它很难阅读和维护。

【问题讨论】:

    标签: matlab for-loop nested


    【解决方案1】:

    ndgrid 可用于将多个嵌套循环合并为一个。它生成值的所有组合(下面代码中的变量aabbcc),因此可以使用单个索引(下面的k)来遍历所有组合。但请注意,生成所有组合可能需要大量内存,具体取决于您的 LMN

    [cc, bb, aa] = ndgrid(C, B, A); %// outermost variable should be rightmost here
    for k = 1:numel(aa)
         myfunc(aa(k), bb(k), cc(k));
    end
    

    【讨论】:

      【解决方案2】:

      感谢接受答案的指导,我制作了一个泛化到任意数量数组的函数。结果是 N 元组的二维数组 - 其中 N 是输入数组的数量。

      function [Result] = makeTuples(varargin)
      
      nInputArgs = length(varargin);
      b = cell(1, nInputArgs);
      a = flip(varargin);
      
      [b{:}] = ndgrid(a{:});
      bb = flip(b);
      nOutputs = length(bb);
      N = numel(bb{1});
      
      Result = zeros(N, nInputArgs);
      arr = zeros(1,nInputArgs);
      for j = 1:N
          for k = 1:nOutputs
              arr(k) = bb{k}(j);
          end
          Result(j,:) = arr;
          arr = zeros(1,nInputArgs);
      end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-25
        • 2017-08-27
        • 2017-11-11
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        • 2020-05-21
        • 2019-12-26
        相关资源
        最近更新 更多