2011-12-14 19 views
6

ブール値配列flagを持っています。matlabでベクトル化された場合

私は2つの数値配列ifTrue,ifFalseを持っています。これらの配列はすべて同じサイズです。この質問の目的上、これらの配列のすべての要素は一意であると仮定します。 flagがfalseの場合

私はflagがtrueの場合

a = g(flag, ifTrue, ifFalse) 

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

または英語で

が、私は ifTrue要素を返すように gをご希望の性質を持つ関数 g、および ifFalse要素をしたいと思います。

あるいは、MathWorks社のMATLABで、私はループでこれを行うことができます:

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

はベクトル化されたアプローチはありますか?そのフラグを想定し

おかげ

答えて

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を:) – kol

1

は、偽の要素のための真のためのもの、とゼロ含まれています。このソリューションは私よりもはるかに効率的ですa = flag .* ifTrue + (1 - flag) .* ifFalse;

+0

それはその、注目に値するかもしれませんこのソリューションはInfとnanを適切に処理しません。受け入れられた答えは、このケースを正しく処理します。 – John

関連する問題