2011-12-14 6 views
6

में मेरे पास एक बुलियन सरणी है जिसे flag पर कॉल करें।वेक्टरकृत अगर matlab

मेरे पास दो अंकीय एरे 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 

वहाँ एक vectorized दृष्टिकोण है?

धन्यवाद

उत्तर

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

यह ध्यान देने योग्य हो सकता है, कि यह समाधान इंफ और नैन के ठीक से संभाल नहीं करता है। स्वीकृत उत्तर उस मामले को सही तरीके से संभालता है। – John

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^