# Generating Exaustive Parameter Combinations

1 view (last 30 days)
Florian Rössing on 29 Nov 2022
Commented: Bruno Luong on 3 Dec 2022
Hi Everyone.
I want to create many Simulink.SimulationInput Objekts to simulate with many parameters.
To achieve this I am looking for a way to create exhaustive combinations of parameters.
I have not yet decided but thought, that structs might be usefull here. So far the Idea looks like this:
%function simIn = createSimIn(ModelName,Parameters)
% ParameterNames = fieldnames(Parameters);
% simIn(1:length(Parameters)) = Simulink.SimulationInput(ModelName);
% for i = 1:length(Parameters)
% for ii = 1:length(ParameterNames)
% simIn(i) = simIn(i).setVariable(ParameterNames(ii),Paramters(i).(ParameterNames(ii)),'Workspace',simIn(i).ModelName);
% end
% end
%end
To get this running I would need a way to create a struct with and exhaustive combination of the parameters.
Lets say I have parameters:
a = 1:5;
b= 0:0.1:0.4;
Example = struct('a',num2cell(a),'b',num2cell(b))
Example = 1×5 struct array with fields:
a b
I would want to create a struct that contains an exhaustive combinations, for a known number of parameters and equal lengths i can do:
Example = struct('a',num2cell(sort(repmat(a,1,length(b)))), ...
'b',num2cell(repmat(b,1,length(a),1)))
Example = 1×25 struct array with fields:
a b
But I would want to do it for an arbitrary number of parameters and arbitrary multiplicities for the parameters. Is there an easier way to do this?
##### 2 CommentsShowHide 1 older comment
Florian Rössing on 30 Nov 2022
Loops are my fallback option, but they are ugly, so i hoped there might be a nicer way to doing this.
Meshgrids i never heard of before, but I just looked it up, looks like you can only use that for 2 and 3D Data.

Bruno Luong on 30 Nov 2022
Edited: Bruno Luong on 30 Nov 2022
I start with a scalar structure s rather than the structure array, since paramereters might have different lengths
s=struct('a', 1:3, ...
'b', 1:4, ...
'c', 1:5)
s = struct with fields:
a: [1 2 3] b: [1 2 3 4] c: [1 2 3 4 5]
c = struct2cell(s);
n = length(c);
[c{:}] = ndgrid(c{:});
A = reshape(cat(n+1,c{:}),[],n);
sarg = [fieldnames(s)'; num2cell(num2cell(A),1)];
Sexpand = struct(sarg{:})'
Sexpand = 1×60 struct array with fields:
a b c
Bruno Luong on 3 Dec 2022
Here is the fix:
s=struct('a', 1:3, ...
'b', 1:4, ...
'c', 1:5, ...
'str', "Test")
s = struct with fields:
a: [1 2 3] b: [1 2 3 4] c: [1 2 3 4 5] str: "Test"
c = cellfun(@num2cell,struct2cell(s),'unif',0);
n = length(c);
[c{:}] = ndgrid(c{:});
A = reshape(cat(n+1,c{:}),[],n);
sarg = [fieldnames(s)'; num2cell(A,1)];
Sexpand = struct(sarg{:});
Sexpand(1)
ans = struct with fields:
a: 1 b: 1 c: 1 str: "Test"
Sexpand(end)
ans = struct with fields:
a: 3 b: 4 c: 5 str: "Test"

### Categories

Find more on Simulink Functions in Help Center and File Exchange

R2022a

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!