Подтвердить что ты не робот

Условное присвоение Matlab

Я ищу эквивалент Matlab условного назначения С# condition ? true-expression : false-expression. Самое большее, что я знаю, это a = 5>2, который является истинным\ложным назначением,
но есть ли какое-либо однострочное условное назначение для if condition a=1;else a=2; end?

4b9b3361

Ответ 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