2012-10-04 27 views
2

我有一個載體孤男寡女在一個向量乘以if語句的使用方法:矢量化

V=[ 1 2 3 5 9]; 

,想乘這樣的:

newVect=zeros(1,length(V)); 

for i=1:length(V) 

    if V(i)==1 
     newVect(i)=V(i)*somevaluex 
    elseif V(i)==5 
     newVect(i)=V(i)*somevaluey 
    else 
     newVect(i)=V(i); 
end 

這似乎很麻煩,因爲我實際上是在處理具有10000個元素的數組。不知何故,這可以用矢量化來代替嗎?

回答

4

你可以這樣做:

newVect = V .* ( someValuex.*(V==1) + someValuey.*(V==5) + V.*((V~=1) & (V~=5))) 

或更快一點:

newVect=V; 
newVect(V==1)=V(V==1)*someValuex; 
newVect(V==5)=V(V==5)*someValuey; 
+0

啊!很好謝謝 :)!如果V是一個大矩陣(r = 100000,c = 100),這是否必須在for循環內逐行進行?還是可以用類似於上述的方法來完成? – HCAI

+0

如果'V'是一個矩陣,第一個例子肯定會起作用。第二個可能會改變'V'的形狀。更容易的是你自己嘗試。 – Oli

+0

啊,我注意到如果someValuex = rand;那麼這個「rand」值在整個過程中保持不變,我希望它改變。你怎麼看?即。 'newVect = V。*(rand。*(V == 1)+ someValuey。*(V == 5)+ V。*((V〜= 1)&(V〜= 5)))' – HCAI