% Define ranges for variables to iterate over var1_range = [1, 2, 3, 4, 6]; var2_range = [10, 20]; var3_range = [100, 200]; % Prepare the parallel pool if isempty(gcp('nocreate')) parpool; % Start a parallel pool if not already running end % Array to hold measurement futures measurements = parallel.FevalFuture.empty(); % Array to hold DSP results dsp_results = parallel.Future.empty(); % Nested for loops for all parameter combinations lin_idx = 1; for v1 = var1_range for v2 = var2_range for v3 = var3_range % Construct the struct of optional variables for this iteration optionalVars = struct('var_4', v1, 'var_5', v2, 'var_6', v3); % Submit the measurement function to the parallel pool measurements(lin_idx) = parfeval(@measurement, 1, optionalVars); % Link DSP function to run after measurement completes dsp_results(lin_idx) = afterEach(measurements(lin_idx), @(output) rundsp(output, optionalVars), 1); lin_idx = lin_idx + 1; % Increment linear index end end end % Fetch and display DSP results final_results = cell(numel(dsp_results), 1); for i = 1:numel(dsp_results) fprintf('Fetching DSP result for job %d...\n', i); final_results{i} = fetchOutputs(dsp_results(i)); % Fetch each DSP result individually end fprintf('All DSP evaluations completed.\n'); disp('Final Results:'); disp(final_results); % --- Measurement Function --- function output = measurement(varargin) % Default values for optional variables var_1 = 1; var_2 = 2; var_4 = 10; % Default value for var4 var_5 = 20; % Default value for var5 var_6 = 30; % Default value for var6 var_7 = 40; % Default value for var7 var_8 = 50; % Default value for var8 var_9 = 60; % Default value for var9 var_10 = 70; % Default value for var10 % Parse optional input arguments if ~isempty(varargin) var_s = varargin{1}; if isstruct(var_s) fields = fieldnames(var_s); for i = 1:numel(fields) eval([fields{i}, ' = ', num2str( var_s.(fields{i}) ), ';']); fprintf("%s <-- %.2f \n", fields{i}, var_s.(fields{i})); end else error('Optional variables should be passed as a struct.'); end end % Simulate output with a random delay output = randi(5); % Random result pause(output); % Simulate processing time end % --- DSP Function --- function output = rundsp(measurement_output, varargin) % Parse optional input arguments if ~isempty(varargin) var_s = varargin{1}; if isstruct(var_s) fields = fieldnames(var_s); for i = 1:numel(fields) eval([fields{i}, ' = ', num2str( var_s.(fields{i}) ), ';']); fprintf("%s <-- %.2f \n", fields{i}, var_s.(fields{i})); end else error('Optional variables should be passed as a struct.'); end end % Simulate DSP processing based on measurement output output = measurement_output + 10; % Add 10 to measurement output pause(measurement_output); % Simulate DSP processing time end