对于任意数量的参数(不固定为3),可以使用以下代码。它利用comma-separated lists,这是一个处理可变数量参数的强大工具。
设 n 为参数的数量。那么组合的数量是N = 3^n。
params = {linspace(0,10,3), linspace(20,40,3), linspace(6,66,3)};
%// cell array with arbitrary number of elements. Each cell contains a 3-vector
%// which defines min, mid, max of one parameter.
n = numel(params); %// number of parameters
N = 3^n; %// number of combinations
paramCombs = cell(1,n); %// initialization for output of ndgrid
[paramCombs{end:-1:1}] = ndgrid(params{end:-1:1}); %// generate all combinations
%// in desired order. Gives n matrices, each containing values of one parameter
paramCombs = cellfun(@(c) c(:), paramCombs, 'uni', 0); %// linearize matrices
%// into n column vectors, each with N rows.
paramCombs = [paramCombs{:}]; %// concat column vectors into N x n matrix
paramCombs = mat2cell(paramCombs,ones(N,1),ones(n,1)); %// convert to
%// N x n cell array. Each row contains a combination of parameter values
result = arrayfun(@(n) myFun(paramCombs{n,:}), 1:N, 'uni', 0); %// call myFun
%// with each combination of parameter values
result 变量是一个 1 x N 元胞数组,其中每个元胞包含调用 myFun 并结合 n 个参数的结果。
示例 1:myFun 的输出只是简单地复制了输入(如 @thewaywewalk's answer)。 params定义如上,所以有3个参数:
>> result{1}
ans =
0 20 6
>> result{2}
ans =
0 20 36
>> result{3}
ans =
0 20 66
>> result{4}
ans =
0 30 6
>> result{5}
ans =
0 30 36
等等
示例 2:带有 2 个参数的案例:params = {linspace(0,2,3), linspace(0,10,3)}。同样,myFun 只是复制输入:
>> result{1}
ans =
0 0
>> result{2}
ans =
0 5
>> result{3}
ans =
0 10
>> result{4}
ans =
1 0
>> result{5}
ans =
1 5
等等
该方法可以进一步推广到每个参数的任意(可能不同)数量的值,只需将N = 3^n;行替换为
N = prod(cellfun(@numel, params)); %// number of combinations
示例3:有2个参数;第一个有 3 个值,第二个有 2 个:params = {[1 2 3], [10 20]};:
>> result{1}
ans =
1 10
>> result{2}
ans =
1 20
>> result{3}
ans =
2 10
>> result{4}
ans =
2 20
>> result{5}
ans =
3 10
>> result{6}
ans =
3 20