Я ищу эквивалент Matlab условного назначения С# condition ? true-expression : false-expression
. Самое большее, что я знаю, это a = 5>2
, который является истинным\ложным назначением,
но есть ли какое-либо однострочное условное назначение для
if condition a=1;else a=2; end
?
Условное присвоение Matlab
Ответ 1
Условное присвоение одной строки:
a(a > 5) = 2;
Это пример логической индексации, a > 5
является логической (то есть логической или двоичной) матрицей/массивом того же размера, что и a
с 1
, где когда-либо выражение было истинным. Левая часть вышеуказанного присваивания относится ко всем позициям в a
, где a>5
имеет 1
.
b = a > 5; % if a = [9,3,5,6], b = [1,0,0,1]
a(~b) = 3;
c = a > 10;
a(b&c) = ...
Etc... вы можете делать почти все, что вы ожидаете, с такими логическими массивами.
Ответ 2
Для числовых массивов существует другое решение -
// C:
A = COND ? X : Y;
становится
% MATLAB
% A, X and Y are numerics
% COND is a logical condition.
A = COND.*X + (~COND).*Y ;
Преимущество:
работает чудесно параллельно для векторов или больших массивов - каждый элемент в A
назначается в зависимости от соответствующего условия. Эта же линия работает для:
- условие является скалярным, массивы
X
иY
равны по размеру - условие - это массив любого размера, X и Y - скаляры
- а X и Y - все массивы одинакового размера
Внимание:
Не работает с NaN
s. Осторожно! Если элемент X
равен NaN
, или элемент Y
- nan, тогда вы получите NaN
в A
, независимо от условия.
Действительно полезное следствие:
вы можете использовать bsxfun
, где COND
и X
/Y
имеют разные размеры.
A = bsxfun( @times, COND', X ) + bsxfun( @times, ~COND', Y );
работает, например, где COND
и X
/Y
являются векторами разной длины.
аккуратный eh?
Ответ 3
Matlab не имеет тернарного оператора. Вы, хотя легко напишите функцию, которая сделает для вас такую вещь:
function c = conditional(condition , a , b)
if condition
c = a;
else
c = b;
end
end