gpt4 book ai didi

matlab - MATLAB 中所有可能的参数组合的条件选择

转载 作者:行者123 更新时间:2023-12-02 01:17:54 24 4
gpt4 key购买 nike

这是问题 All possible combinations of many parameters MATLAB 的后续问题

除了参数集的所有可能组合之外,我还有一个条件参数。例如,仅当参数“corrAs”设置为“objective”时,我才需要包含名为“lambda”的参数。

做到这一点,现在我正在做以下事情

%% All posible parameters
params.corrAs = {'objective', 'constraint'};
params.size = {'small', 'medium', 'large'};
params.density = {'uniform', 'non-uniform'};
params.k = {3,4,5,6};
params.constraintP = {'identity', 'none'};
params.Npoints_perJ = {2, 3};
params.sampling = {'hks', 'fps'};

% If corrAs is 'objective', then also set lambda
params.lambda = {0.01, 0.1, 1, 10, 100};

%%%%%%%%%%%%% The solution posted on the link %%%%%%%%%%%
%% Get current parameter and evaluate
fields = fieldnames(params);
nFields = numel(fields);
sz = NaN(nFields, 1);

% Loop over all parameters to get sizes
for jj = 1:nFields
sz(jj) = numel( params.(fields{jj}) );
end

% Loop for every combination of parameters
idx = cell(1,nFields);
for ii = 1:prod(sz)
% Use ind2sub to switch from a linear index to the combination set
[idx{:}] = ind2sub( sz, ii );
% Create currentParam from the combination indices
currentParam = struct();
for jj = 1:nFields

%%%%%%%%%%% My addition for conditional parameter %%%%%%%%%%%
% lambda is valid only when corrAs is 'objective'
if isfield(currentParam, 'corrAs') && strcmp(fields{jj}, 'lambda') && ~strcmp(currentParam.corrAs, 'objective')
continue;
end
currentParam.(fields{jj}) = params.(fields{jj}){idx{jj}};
end

%% Do something with currentParam

end

它可以工作,但是,即使 corrAs 不是“目标”,主 for 循环的迭代次数也包括 lambda 参数。因此,我最终使用相同的 currentParam 进行了多次评估。

如何才能更有效地完成工作?

最佳答案

考虑这个问题的一个简单方法是将代码分解为更加基于函数

在下面的代码中,我只是将组合处理代码放入函数 paramProcessing 中。 。 此函数被调用两次 -

  1. 何时 params.corrAs'constraint'只是,所有组合都会被处理,没有 lambda领域。

  2. 何时 params.corrAs'objective'只是,所有组合都将使用附加 lambda 进行处理。领域。

您可以获得 paramProcessing 的输出如果循环中存在一个函数,则函数。

这意味着您只进行您想要的组合。从您的问题来看,似乎每个组合都是独立的,因此您在单独的循环中覆盖组合应该是无关紧要的。函数用法意味着您不必在循环中使用新条件,并且 params.corrAs 的不同可能值每次确保没有重叠。

paramProcessing函数可以是主函数文件中的本地函数(如图所示)、脚本中的本地函数(对于较新的 MATLAB 版本)或路径上其自己的 .m 文件中。

代码:

function main()
%% All posible parameters, corrA is 'constraint' only.
params.corrAs = {'constraint'};
params.size = {'small', 'medium', 'large'};
params.density = {'uniform', 'non-uniform'};
params.k = {3,4,5,6};
params.constraintP = {'identity', 'none'};
params.Npoints_perJ = {2, 3};
params.sampling = {'hks', 'fps'};

% First processing call, no 'lambda' field exists in 'params'
paramProcessing( params );

% Cover the cases where corrAs is 'objective', with 'lambda' field
params.corrAs = {'objective'};
params.lambda = {0.01, 0.1, 1, 10, 100};

% Second processing call, with new settings
paramsProcessing( params );
end
function paramProcessing( params )
%% Get current parameter and evaluate
fields = fieldnames(params);
nFields = numel(fields);
sz = NaN(nFields, 1);

% Loop over all parameters to get sizes
for jj = 1:nFields
sz(jj) = numel( params.(fields{jj}) );
end

% Loop for every combination of parameters
idx = cell(1,nFields);
for ii = 1:prod(sz)
% Use ind2sub to switch from a linear index to the combination set
[idx{:}] = ind2sub( sz, ii );
% Create currentParam from the combination indices
currentParam = struct();
for jj = 1:nFields
currentParam.(fields{jj}) = params.(fields{jj}){idx{jj}};
end

%% Do something with currentParam

end
end

关于matlab - MATLAB 中所有可能的参数组合的条件选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54098049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com