How to Write all of an if-statement in a Single Lline?

Is there any way to write all of an if-statement in a single line?
if A == 1 B = 2 elseif B = 3 end

 Accepted Answer

if A ==1 B = 2, else B = 3, end
But what is the aim of this?

5 Comments

I want to make this part of the code more readable, as they come beneath each other. For example:
if A ==1 B = 2, else B = 3, end
if A ==2 B = 3, else B = 4, end
want to use inline function
This was acutally super useful for me too.
I have a function with a bunch of nested loops (with more optional loops inside), and a fprintf that diplays what actual path its taking inside the function (used for trouble shooting) . This function however ends up inside a parfor loop, wherein that troubleshooting output needs to be supressed.
I wanted a "verbose" setting where in that output could be supressed but having a bunch of
if verbose
fprintf('...')
end
was making the code hard to read. if verbose, fprintf('...'), end is much cleaner.
Consider writing a "logme" function.
function logme(messageToLog)
verbose = true;
if verbose
fprintf('%s', messageToLog)
end
end
Now your code will contain calls to logme.
logme("Diagnostic message #1")
If you want to run without displaying these messages, change the definition of verbose inside logme. You could potentially also modify logme to log those messages not to the screen but to a log file without changing the callers of logme.
If you want to set up if-else statement with a single line and make it into an inline funciton, you can think of such a thing.
ternary = @(varargin) varargin{end - varargin{1}};
ternary(true,'yes','no') % If the first argument is true, the result becomes 'yes'
ans = 'yes'
ternary(false,'yes','no') % If the first argument is false, the result becomes 'no'
ans = 'no'

Sign in to comment.

More Answers (1)

You can employ logicals as factors toggling between 0 and 1:
B = 2 + 1*(A~=1);
%or
%B = 3 + (-1)*(A==1) ; % just roles reversed - depending on taste
This approach works whenever your if-statement just discriminates between two versions of a single assignment to one and the same variable as your example does.
I personally find this particular useful if there is a base value (here 2) and some delta added conditionally (here, +1 to obtain 3). You can also extend for further conditions.

2 Comments

The problem is if you want to get NaN on the case of, for example A==1
2+NaN*(A==1) doesnt work because 0*NaN return NaN just as 1*NaN does.
Also employing the NaN() function like
2+NaN(A==1) doesnt help since NaN(0) returns [] and canot be added to a scalar.
Any ideas?
How about
0/(A-1) + 3 %returns different numeric values for different A ~= 1
or
0/( (A==1)-1 ) + 3 % returns 3 for all A ~= 1

Sign in to comment.

Categories

Find more on Argument Definitions 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!