# set order of elseif

4 views (last 30 days)
Rub Ron on 17 Dec 2020
Commented: James Tursa on 17 Dec 2020
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 CommentsShowHide 1 older comment
KSSV on 17 Dec 2020
Have a look on switch.

James Tursa on 17 Dec 2020
Edited: James Tursa on 17 Dec 2020
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.
James Tursa on 17 Dec 2020
I gave Bruno a vote since he contributed a key part of the solution.

Bruno Luong on 17 Dec 2020
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 CommentsShowHide 1 older comment
Bruno Luong on 17 Dec 2020
Edited: Bruno Luong on 17 Dec 2020
Of course, unroll all 6 possible permutations
if strcmp(prefered_order, 'xyz')
elseif strcmp(prefered_order, 'yxz')
% another order...
elseif strcmp(prefered_order, 'zyx')
....
end

KSSV on 17 Dec 2020
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
Rub Ron on 17 Dec 2020
I updated my post, hopefully now it is clearer.