Я ищу эквивалент 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