Generating Exaustive Parameter Combinations

4 vues (au cours des 30 derniers jours)
Florian Rössing
Florian Rössing le 29 Nov 2022
Commenté : Bruno Luong le 3 Déc 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 commentaires
Jan
Jan le 29 Nov 2022
What about using meshgrid or loops?
Florian Rössing
Florian Rössing le 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.

Connectez-vous pour commenter.

Réponse acceptée

Bruno Luong
Bruno Luong le 30 Nov 2022
Modifié(e) : Bruno Luong le 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
  5 commentaires
Bruno Luong
Bruno Luong le 2 Déc 2022
Sorry my code is never intended to work on anything different than numerical data.
Bruno Luong
Bruno Luong le 3 Déc 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"

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Creating and Concatenating Matrices dans Help Center et File Exchange

Produits


Version

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by