2014-08-28 2 views
1

Я хотел бы заменить элементы вектора, используя условие или функцию.Заменить векторные элементы, используя условие/if в matlab

a = [10 20 60];

если < 30 = 4 еще а = 5

результат должен выглядеть следующим образом:

б = [4 4 5]

+0

кстати вы не указали, что вы хотите, чтобы произошло за номером 30. – Dan

+0

Привет Дэн, я извиняюсь, я уже говорил вторую часть, если мой если заявление неправильно, я буду редактировать его. Спасибо, что отметили это как дубликат, однако я хотел бы упомянуть, что я предпочитаю ответ @Divakar. Однако он может изменить свой ответ, я думаю, после того, как я отредактировал свой вопрос. Я извиняюсь за неудобства. С уважением, – Crysthius

ответ

3

Solution с помощью logical indexing -

cond1 = a < 30 
cond2 = a > 30 
b = 4.*cond1 + 5.*(cond2) + a.*(~(cond1 | cond2)) 

Краткое описание:cond1 и cond2 образуют логические массивы на основе условий IF-ELSE, которые используются для индексирования и образуют числовой массив «масштабированных» значений 4 or 5, сохраняя при этом 30.

Однострочник версия: Если вы в острот, это может питать интерес -

b = 4.*(a < 30) + 5.*(a > 30) + a.*(~(a > 30 | a < 30)) 

Пример # 1

a = 
    10 20 60 30 
b = 
    4  4  5 30 

Другой связанный интересный вопрос - Matlab: Remove IF-ELSE Conditional statements using Logical Indexing

+0

Большое вам спасибо, что именно я искал, так как вы предложили, я также изучу логическое индексирование. С уважением – Crysthius

+0

@Crysthius Awesome! Рад, что это сработало для вас. Посмотрите на «логическое индексирование», это мощный инструмент! Добавлено одно соединение в решении. – Divakar

+0

Ваша помощь очень ценится. С уважением – Crysthius

4

Другая версия, использующая logical indexing:

a = [10 20 60]; 

b = a; 
b(b < 30) = 4; 
b(b >= 30) = 5; 
+1

Одна коррекция: последняя строка должна быть «больше или равна»: 'b (b> = 30) = 5;' – tkocmathla

Смежные вопросы