这是一个递归函数,用于将所有可能的参数集作为数组的列向量生成:
function idx=dynloop(varargin)
if nargin==1
idx=varargin{1};
else
idx=dynloop(varargin{2:end});
idx=[repelem(varargin{1},size(idx,2));
repmat(idx,[1,length(varargin{1})])];
end
return
示例输出:循环遍历
5:7
,然后是
8
,最后是
[2,3,5,7]
:
>> idx = dynloop(5:7,8,[2,3,5,7])
idx =
5 5 5 5 6 6 6 6 7 7 7 7
8 8 8 8 8 8 8 8 8 8 8 8
2 3 5 7 2 3 5 7 2 3 5 7
输出与
ndgrid
相当(除了在我的观点中更直观地形成)。 (此外,一些初步的基准测试显示这可能比
ndgrid
稍微快一点...?待确定)
主循环:现在只需使用一个循环来迭代
idx
的列。请注意,正如@Daniel在OP上评论的那样,此解决方案概念类似于
this solution。
Weight = 45000:5000:75000;
Altitude = 10000;
Speed = 0.2:0.1:0.9;
idx = dynloop(Weight,Altitude,Speed);
for ii=1:size(idx,2)
params = idx(:,ii);
end
编辑:处理字符串和数字输入
对我之前发布的递归函数进行简单修改,使其可以返回索引而不是实际元素,因此字符串单元格也可以正常处理:
function idx=dynloop(varargin)
if nargin==1
idx=1:length(varargin{1});
else
idx=dynloop(varargin{2:end});
idx=[repelem(1:length(varargin{1}),size(idx,2));
repmat(idx,[1,length(varargin{1})]);];
end
return
因此,您的函数应该按照以下方式运作:
function yourMainFcn(varargin)
idx=dynloop(varargin{:});
for ii=1:size(idx,2)
params = cellfun(@(x,k) numORcell(x,k),...
varargin,num2cell(idx(:,ii).'),...
'UniformOutput',0);
disp(params)
end
end
函数 numORcell
适当地解析数值和单元格数据:
function y=numORcell(x,k)
if iscell(x)
y=x{k};
else
y=x(k);
end
end
字符串示例:
Weight = 45000:5000:75000;
Altitude = 10000;
Speed = 0.2:0.1:0.9;
Names = {'Foo','Bar'};
>> yourMainFcn(Names,Altitude,Weight)
'Foo' [10000] [45000]
'Foo' [10000] [50000]
'Foo' [10000] [55000]
'Foo' [10000] [60000]
'Foo' [10000] [65000]
'Foo' [10000] [70000]
'Foo' [10000] [75000]
'Bar' [10000] [45000]
'Bar' [10000] [50000]
'Bar' [10000] [55000]
'Bar' [10000] [60000]
'Bar' [10000] [65000]
'Bar' [10000] [70000]
'Bar' [10000] [75000]
或者使用以下代码:
>> yourMainFcn(Names,Names,Speed,Names)
'Foo' 'Foo' [0.2] 'Foo'
'Foo' 'Foo' [0.2] 'Bar'
'Foo' 'Foo' [0.3] 'Foo'
'Foo' 'Foo' [0.3] 'Bar'
'Foo' 'Foo' [0.4] 'Foo'
...
'Foo' 'Foo' [0.9] 'Bar'
'Foo' 'Bar' [0.2] 'Foo'
...
'Foo' 'Bar' [0.9] 'Bar'
'Bar' 'Foo' [0.2] 'Foo'
...
'Bar' 'Foo' [0.9] 'Bar'
...
'Bar' 'Bar' [0.8] 'Foo'
'Bar' 'Bar' [0.8] 'Bar'
'Bar' 'Bar' [0.9] 'Foo'
'Bar' 'Bar' [0.9] 'Bar'
读者需要自己完成的练习:如果将所有下标存储在
idx
中会导致内存问题,那么你肯定正在进行一些相当复杂的循环。不过,你可以创建一个函数来确定从当前索引集到下一个字典序索引集的方法,这意味着你只需要存储一个索引集,并在每次循环结束时进行迭代即可。