Generating Exaustive Parameter Combinations

2 visualizaciones (últimos 30 días)
Florian Rössing
Florian Rössing el 29 de Nov. de 2022
Comentada: Bruno Luong el 3 de Dic. de 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 comentarios
Jan
Jan el 29 de Nov. de 2022
What about using meshgrid or loops?
Florian Rössing
Florian Rössing el 30 de Nov. de 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.

Iniciar sesión para comentar.

Respuesta aceptada

Bruno Luong
Bruno Luong el 30 de Nov. de 2022
Editada: Bruno Luong el 30 de Nov. de 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 comentarios
Bruno Luong
Bruno Luong el 2 de Dic. de 2022
Sorry my code is never intended to work on anything different than numerical data.
Bruno Luong
Bruno Luong el 3 de Dic. de 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"

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by