векторизован, если в Matlab

У меня есть логический массив, назовите его flag.

У меня есть два числовых массива ifTrue, ifFalse. Все эти массивы имеют одинаковый размер. Для целей этого вопроса предполагается, что каждый элемент в этих массивах уникален.

Мне нужна функция g со свойством, которое

a = g(flag, ifTrue, ifFalse)

all(flag == (a == ifTrue))
all(~flag == (a == ifFalse))

Или, говоря по-английски, я хотел бы, чтобы g возвращал ifTrue элементов, когда flag истинно, и ifFalse элементов, когда flag ложно.

Или в Matlab я мог бы сделать это с помощью циклов:

a = zeros(size(ifTrue));
for i = 1 : numel(ifTrue);
    if flag(i)
         a(i) = ifTrue(i)
    else
         a(i) = ifFalse(i)
    end
end

Есть векторизованный подход?

Спасибо


person John    schedule 14.12.2011    source источник


Ответы (1)


Предполагая, что этот флаг содержит единицы для истинных и нули для ложных элементов: a = flag .* ifTrue + (1 - flag) .* ifFalse;

person kol    schedule 14.12.2011
comment
Возможно, стоит отметить, что это решение не обрабатывает Inf и nan должным образом. Принятый ответ действительно обрабатывает этот случай правильно. - person John; 08.09.2017