Ternary Operator in Matlab

Ternary Operator in Matlab

is there a way of typing for if like:

var = (cond) ? true : false;

or do we have to use this format?

if (cond)
 true
else
 false
end
1

10 Answers

MatLab doesn't have a ternary operator, or any other syntactic sugar for one-line if-statements. But if your if-statement is really simple, you could just write it in one line anyway:

if (cond); casetrue(); else; casefalse(); end

It's not as simple as ternary operator, but still better than writing it in 5 lines of code.

1

Hmm... no one has mentioned this

fi = @(varargin)varargin{end-varargin{1}}

somewhere in the docs it is written the `end' is coming to one so this will be more future proof

fi = @(varargin)varargin{length(varargin)-varargin{1}}

Usage :

fi(input('Do you like Matlab ? '),'yes','no')
>> no

If your in the need of inline cases see Mathworks ...

If you only need true or false, you can do what MatlabSorter suggests. In case you want a real tertiary operator (i.e. a = b ? c : d), there is none in MATLAB. However, using the file supplied here, you can get close.

You can do

var = 5 > 4;

which will set var to true. Just substitute what ever you need for 5 > 4.

2

MATLAB doesn't have conditional expressions, but in some situations you can get a similar effect by saying, e.g., var = cond*true_expr + (1-cond)*false_expr. Unlike C's conditional expression, this will of course always evaluate both true_expr and false_expr, and if cond happens not to be either 0 or 1 (note: false behaves like 0; true behaves like 1) you'll get crazy results.

3

Replace

c = (x ? a : b)

by

c = subsref({b; a}, substruct('{}', {x + 1}))

x should be a boolean value or 1 or 0.
true or 1 will select a
false or 0 will select b
This should work with all what cells can contain and can also be used in an intricate formular!

1

Quick and elegant. I would simply write tern( a>b, a, b) Downside is you have to copy paste everywhere, or have and extra file in the directory

function b = tern(cond, a, b)
    if cond
        b=a;
    end
end
1

@Leonid Beschastny is correct about the inlining the if-else-end statement, but If one must, then with any assignment value that can be evaluated as boolean, one can the shortcut boolean operators || and &&:

(cond) && ((var=true_val)||1) || (var=false_val);

Rules:

  1. shortcut boolean ops || and && must be used, NOT | or &
  2. will work with boolean, numeric and char assignments
  3. will NOT work with cell array or function handles
  4. the assignments must be wrapped in parenthesis.
  5. (var=true_val) must be followed by ||1 in case true_val == false
  6. true and false assignments may be to different variables (i.e. (var1=true_val) while (var2=false_val))
  7. true_val and false_val can be different types provided each then can be evaluated as boolean

Alternatively one can do this:

cond && (func1(..)||1) || func2(...);

provided func1 and func2 return a boolean testable value including nothing at all (but no cell arrays!):

1

I use this style frequently:

cond = what < ever;

n = getfield([23,42], {1+(what < ever)}) % for any 1x1-data
s = cell2mat(getfield({'no','yes'}, {1+(what < ever)})) % for nonuniform

it's compact enough to not require a helper function

I know this is late, but for people trying to find an answer I came up with this.

If you want a boolean var = (cond) ? true : false; you can just do:

var = cond;

If you want a number var = (cond) ? value_if_true: value_if_false; then do:

var = cond*value_if_true + ~cond*value_if_false;

This is all using that matlab treats true as 1 and false as 0. Therefore that's why the first statement expanded really is

var = cond*1+ ~cond*0;

If you want a text var = (cond) ? text_if_true: text_if_false; then do:

[repmat(text_if_true,1,cond) repmat(text_if_false,1,~cond)];

Unfortunately you can't mix numerical values with text using this method, just write it with an if-else-end statement.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

James H. Sterling
Author

James H. Sterling

James Sterling reports on renewable energy developments, climate policy, ecological conservation, and green tech innovations around the globe.