避免在MATLAB中嵌套for循环

时间:2014-11-25 23:20:45

标签: matlab for-loop nested

我在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

我正在考虑使用L的{​​{1}},A个元素的M元素以及B N元素,并将它们展开进入一个单元格数组,并在该单元格数组上使用单个for循环进行迭代。

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

感谢接受答案的指示,我制作了一个可以推广到任意数量的数组的函数。结果是一个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