векторизация, если в Matlab - PullRequest
       4

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

6 голосов
/ 14 декабря 2011

У меня есть логический массив, назовите его 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

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

Спасибо

Ответы [ 2 ]

8 голосов
/ 14 декабря 2011
%# Given, for example:
ifTrue = 1:10
ifFalse = -ifTrue  
flag = rand(1,10) > 0.5
%# First, set 'a' to ifFalse
a = ifFalse
%# Then override the places where flag is true
a(flag) = ifTrue(flag)
1 голос
/ 14 декабря 2011

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

...