Что вам нужно, это все комбинации ваших входных параметров. К сожалению, когда вы добавите больше параметров, требования к хранилищу будут быстро расти (и вам придется использовать большую матрицу индексации).
Вместо этого есть идея, которая использует линейные признаки (никогда не создаваемой) матрицы n1*n2*...*nm
, где ni
- количество элементов в каждом поле для полей m
.
Он достаточно гибок, чтобы справиться с любым количеством полей, добавляемых в params
. Не проверено на производительность, хотя, как и в случае любой операции «все комбинации», вам следует опасаться нелинейного увеличения времени вычислений, поскольку вы добавляете больше полей к params
, примечание prod(sz)
!
Код, который я показал, быстр, но производительность будет полностью зависеть от того, какие операции вы выполняете в цикле.
% Add parameters here
params.corrAs = {'objective', 'constraint'};
params.size = {'small', 'medium', 'large'};
params.density = {'uniform', 'non-uniform'};
% Setup
f = fieldnames( params );
nf = numel(f);
sz = NaN( nf, 1 );
% Loop over all parameters to get sizes
for jj = 1:nf
sz(jj) = numel( params.(f{jj}) );
end
% Loop for every combination of parameters
idx = cell(1,nf);
for ii = 1:prod(sz)
% Use ind2sub to switch from a linear index to the combination set
[idx{:}] = ind2sub( sz, ii );
% Create currentParam from the combination indices
currentParam = struct();
for jj = 1:nf
currentParam.(f{jj}) = params.(f{jj}){idx{jj}};
end
% Do something with currentParam here
% ...
end
Asides: