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
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.
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.
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.
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!
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
@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:
- shortcut boolean ops
||and&&must be used, NOT|or& - will work with boolean, numeric and char assignments
- will NOT work with cell array or function handles
- the assignments must be wrapped in parenthesis.
(var=true_val)must be followed by||1in casetrue_val == false- true and false assignments may be to different variables (i.e.
(var1=true_val)while(var2=false_val)) true_valandfalse_valcan 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!):
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.