Generating Exaustive Parameter Combinations
    4 views (last 30 days)
  
       Show older comments
    
    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))
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)))
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 Comments
Accepted Answer
  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)
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{:})'
5 Comments
  Bruno Luong
      
      
 on 2 Dec 2022
				Sorry my code is never intended to work on anything different than numerical data.
  Bruno Luong
      
      
 on 3 Dec 2022
				Here is the fix:
s=struct('a', 1:3, ...
    'b', 1:4, ...
    'c', 1: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)
Sexpand(end)
More Answers (0)
See Also
Categories
				Find more on Interactive Model Editing in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

