set order of elseif

3 次查看(过去 30 天)
Rub Ron
Rub Ron 2020-12-17
评论: James Tursa 2020-12-17
Updated.
I have this code structure inside a loop. x, y and z are 1/0 variables. In this case the order of the elseif statement is: first x is evaluated, then y then z
if x
%code for case x
elseif y
%code for case y
elseif z
%code for case z
end
I would like to define a varible order (for the previous case order={'caseX','caseY','caseZ'}), where I can change the order in which the elseif statement is evaluated. So if I set order={'caseZ','caseX','caseY'}, I should get this: (first z is evaluated, then x then y)
order={'caseZ','caseX','caseY'}
%%% then
if z
%code for case z
elseif x
%code for case x
elseif y
%code for case y
end
An hint will be appreciated.
  2 个评论
Ive J
Ive J 2020-12-17
编辑:Ive J 2020-12-17
I'm not sure if I understood you correctly, but seems easier if you use switch/case. See here:
KSSV
KSSV 2020-12-17
Have a look on switch.

请先登录,再进行评论。

采纳的回答

James Tursa
James Tursa 2020-12-17
编辑:James Tursa 2020-12-17
Does this do what you want:
order = [1 2 3]; % or whatever
for k=1:numel(order)
switch order(k)
case 1
if( x )
% code for case x
break;
end
case 2
if( y )
% code for case y
break;
end
case 3
if( z )
% code for case z
break;
end
end
Or if you prefer the case selection could be for characters 'x', 'y', and 'z' instead of numbers 1, 2, 3.
The key is to have those break statements inside the cases so that the if-elseif-elseif control structure is emulated properly.
  9 个评论
Rub Ron
Rub Ron 2020-12-17
Thanks Bruno, I wish I can accept both answers at the same time, with only one click
James Tursa
James Tursa 2020-12-17
I gave Bruno a vote since he contributed a key part of the solution.

请先登录,再进行评论。

更多回答(2 个)

Bruno Luong
Bruno Luong 2020-12-17
prefered_order = 'xzy';
b = [x y z]; % logical conditions (in if/elseif)
code_to_be_exec = { @xcode, @ycode, @zcode }; % code in the if elseif block put in functions
[~,i] = ismember(prefered_order, 'xyz');
j = find(b(i), 1, 'first');
if ~isempty(j)
feval(code_to_be_exec{i(j)});
end
  2 个评论
Rub Ron
Rub Ron 2020-12-17
do you think there is a way to preseve the if elseif structure? for easy-to-read purpose.
Bruno Luong
Bruno Luong 2020-12-17
编辑:Bruno Luong 2020-12-17
Of course, unroll all 6 possible permutations
if strcmp(prefered_order, 'xyz')
% your original if/else
elseif strcmp(prefered_order, 'yxz')
% another order...
elseif strcmp(prefered_order, 'zyx')
....
end

请先登录,再进行评论。


KSSV
KSSV 2020-12-17
Are you looking something like this.
if z
%code for case z
order = ['case','z'] ;
elseif x
%code for case x
order = ['case','x'] ;
elseif y
%code for case y
order = ['case','y'] ;
end
  3 个评论
KSSV
KSSV 2020-12-17
order = 'z'
if strcmpi(order,'z')
%code for case z
order = ['case','z'] ;
elseif strcmpi(order,'x')
%code for case x
order = ['case','x'] ;
elseif strcmpi(order,'y')
%code for case y
order = ['case','y'] ;
end
Also have a look on switch.
Rub Ron
Rub Ron 2020-12-17
I updated my post, hopefully now it is clearer.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Mathematics 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by