троичный оператор в Matlab - PullRequest
25 голосов
/ 08 апреля 2011

есть ли способ ввода, если вроде:

var = (cond) ? true : false;

или мы должны использовать этот формат?

if (cond)
 true
else
 false
end

Ответы [ 7 ]

26 голосов
/ 20 декабря 2014

MatLab не имеет троичного оператора или какого-либо другого синтаксического сахара для однострочных операторов if. Но если ваше if-утверждение действительно простое, вы все равно можете написать его одной строкой:

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

Это не так просто, как троичный оператор, но все же лучше, чем писать его в 5 строках кода.

10 голосов
/ 08 апреля 2011

Если вам нужно только true или false, вы можете делать то, что предлагает MatlabSorter. Если вам нужен реальный третичный оператор (т.е. a = b ? c : d), в MATLAB его нет. Однако, используя предоставленный файл здесь , вы можете приблизиться.

9 голосов
/ 08 апреля 2011

Вы можете сделать

var = 5 > 4;

, который установит для var значение true.Просто замените то, что вам нужно, на 5> 4.

8 голосов
/ 27 августа 2015

Хм ... никто не упомянул это

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

где-то в документах написано, что "конец" подходит к одному, так что это будет более надежно для будущего

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

Использование:

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

Если вам нужны встроенные чехлы, см. Mathworks ...

8 голосов
/ 08 апреля 2011

MATLAB не имеет условных выражений, но в некоторых ситуациях вы можете получить аналогичный эффект, например, var = cond*true_expr + (1-cond)*false_expr. В отличие от условного выражения C, это, конечно, всегда оценивает и true_expr, и false_expr, и если cond не равно 0 или 1 (примечание: false ведет себя как 0; true ведет себя как 1) вы получите сумасшедшие результаты.

1 голос
/ 06 ноября 2018

Заменить

c = (x ? a : b)

на

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

x должно быть логическим значением или 1 или 0.
true или 1 выберет
false или 0 будетвыберите b
Это должно работать со всем, что могут содержать ячейки, а также может использоваться в сложной формуле!

1 голос
/ 27 октября 2017

Я часто использую этот стиль:

cond = what < ever;

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

он достаточно компактен, чтобы не требовать вспомогательной функции

...