2014-02-17 71 views
0

我有兩個向量,「A」和「B」。兩者都可以包含NaN元素。如果A中的等價元素是非NaN,我只想用「0」替換B中的「NaN」元素。我可以很容易地用For和If循環來做到這一點,但是因爲我想更好地理解使用索引,並且我的假設是使用大數據集索引會更快(?),所以我嘗試了以下方法:根據NaN是否在第二個向量中使用索引來替換NaN

A = [1,2,3,NaN,5,6,NaN,8,9,10]; 
    B = [NaN,2,3,NaN,5,6,NaN,NaN,9,10]; 
    [Bindex] = isnan(B); 
    B(~isnan(A(Bindex))) = 0; 

這隻替換了B(1),而不是B(8)。我錯過了有關使用索引的問題?

回答

-1

我認爲這應該爲你工作:

B(xor(isnan(A), isnan(B))) = 0 
+2

這就產生了給定的輸入了正確的結果,但對於失敗'地方A'包含'NaN的情況下, '在'B'沒有的索引處。 XORing將把'B'中相應的元素設置爲零。 – Praetorian

2

如果您打印的B這些語句後,你會發現你不僅不爲零更換B(8)值,但你也錯誤地將B(4)替換爲零,即使A(4)NaN,因此B(4)與您的調零標準不符。

這裏是發生了什麼事情:

Bindex = isnan(B); # there's no need for brackets around Bindex 

上面的語句返回與那些邏輯陣列地方B包含NaN

Bindex = 
    1 0 0 1 0 0 1 1 0 0 

現在,當索引ABindex使用,logical indexing發生,只有從A具有在Bindex對應true值被提取的那些元素。這意味着表達A(Bindex)收率

1 NaN NaN  8 # A(1), A(4), A(7), A(8) 

所以那麼表達式B(~isnan(A(Bindex))) = 0使用1x4矢量代替原始1x10矢量,並結束設定元件B(1)B(4)爲零。

你需要的是

B(isnan(B) & ~isnan(A)) = 0; 

現在的B

B = 
    0  2  3 NaN  5  6 NaN  0  9 10