2011-12-14 5 views
6

J'ai un tableau booléen l'appeler flag.vectorisé si dans matlab

J'ai deux tableaux numériques ifTrue, ifFalse. Tous ces tableaux sont de la même taille. Pour les besoins de cette question, supposons que chaque élément de ces tableaux est unique.

Je voudrais une fonction g avec la propriété que

a = g(flag, ifTrue, ifFalse) 

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

Ou en anglais, je voudrais revenir gifTrue éléments lorsque flag est vrai, et ifFalse éléments quand flag est faux.

Ou, dans Matlab, je pouvais le faire avec des boucles:

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

Y at-il une approche vectorisé?

Merci

Répondre

8
%# 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) 
+0

+1 Cette solution est beaucoup plus efficace que le mien :) – kol

1

Supposant que l'indicateur contient les pour vrai, et des zéros pour les faux éléments: a = flag .* ifTrue + (1 - flag) .* ifFalse;

+0

Il pourrait être intéressant de noter que cette solution ne gère pas correctement Inf's et nan's. La réponse acceptée gère correctement ce cas. – John

Questions connexes