2011-12-14 13 views
6

Bir boolean dizilim var flag.matlab içinde vektörize edilmişse

İki sayısal dizilim var ifTrue, ifFalse. Bütün bu diziler aynı büyüklüktedir. Bu soruda, bu dizilerdeki her elementin benzersiz olduğunu varsayalım. flag yanlış olduğunda

Ben flag doğru olduğunda

a = g(flag, ifTrue, ifFalse) 

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

Veya İngilizce

, ben ifTrue unsurları dönmek g istiyorum özelliğiyle işlevi g ve ifFalse elemanları istiyoruz.

Veya Matlab'de ben döngüler ile yapabilirsiniz: Bir vektörleşen yaklaşım

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

var mı? O bayrağı varsayarsak

Teşekkür

cevap

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

yanlış elemanları için de geçerlidir için olanları ve sıfır içerir: Bu çözüm benimkinden çok daha verimli olduğunu a = flag .* ifTrue + (1 - flag) .* ifFalse;

+0

O, kayda değer olabilir Bu çözüm, Inf's ve nan'ın uygun şekilde ele alınmaz. Kabul edilen cevap bu vakayı doğru şekilde ele alıyor. – John