set order of elseif
    5 views (last 30 days)
  
       Show older comments
    
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 Comments
Accepted Answer
  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.
9 Comments
More Answers (2)
  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 Comments
  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')
    % your original if/else
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
3 Comments
  KSSV
      
      
 on 17 Dec 2020
				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. 
See Also
Categories
				Find more on Graphics Performance 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!



