我在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循环的方法。它适用于少量循环,但随着这个数字的增长,它很难阅读和维护。
答案 0 :(得分:4)
ndgrid
可用于将多个嵌套循环展平为一个。它生成所有值的组合(变量aa
,bb
,cc
在下面的代码中),以便可以使用单个索引(下面的k
)遍历所有组合。但请注意,生成所有组合可能需要大量内存,具体取决于您的L
,M
,N
。
[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