2014-02-17 30 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