2013-04-17 32 views
3

我有值的矢量,如以下:如何在Matlab中从矢量中移除可变数量的连续NaN值?

1 
2 
3 
NaN 
4 
7 
NaN 
NaN 
54 
5 
2 
7 
2 
NaN 
NaN 
NaN 
5 
54 
3 
2 
NaN 
NaN 
NaN 
NaN 
4 
NaN 

我怎样才能在这样的方式使用

interp1

,只有连续的NaN值的可变量的会被插入?这是例如,我想只插入那些至多有三个连续NaN值的NaN值。所以NaN的楠楠楠楠的NaN会被插入但不楠楠楠楠

感谢您的任何帮助=)

p.S.如果我不能用interp1做到这一点,任何想法如何以另一种方式做到这一点? =)

举个例子,我给了载体将成为:

1 
2 
3 
interpolated 
4 
7 
interpolated 
interpolated 
54 
5 
2 
7 
2 
interpolated 
interpolated 
interpolated 
5 
54 
3 
2 
NaN 
NaN 
NaN 
NaN 
4 
interpolated 
+0

我们是假设线性插值与向量的每个元素与下一个元素的距离相等? – Dan

+0

是=)这是正确的 – jjepsuomi

+0

interp1会插入最后一个'NaN'有问题。只是说'。 –

回答

5

首先,找到NaN值的所有序列的位置和长度:

nan_idx = isnan(x(:))'; 
nan_start = strfind([0, nan_idx], [0 1]); 
nan_len = strfind([nan_idx, 0], [1 0]) - nan_start + 1; 

接下来,找到NaN元素的索引不插:

thr = 3; 
nan_start = nan_start(nan_len > thr); 
nan_end = nan_start + nan_len(nan_len > thr) - 1; 
idx = cell2mat(arrayfun(@colon, nan_start, nan_end, 'UniformOutput', false)); 

现在,一切插值和替换不应被插回用NaN数值的元素:

x_new = interp1(find(~nan_idx), x(~nan_idx), 1:numel(x)); 
x_new(idx) = NaN; 
+1

谢谢你的回答! =) – jjepsuomi

+1

非常欢迎:) –

+0

+1优秀的解决方案。我喜欢在'arrayfun'中使用'@ colon' – Dan

0

我知道这是在MATLAB中的坏习惯,但我认为这种特殊的情况下需要一个循环:

function out = f(v) 
    out = zeros(numel(v)); 
    k = 0; 
    for i = 1:numel(v) 
    if v(i) ~= NaN 
     if k > 3 
     out(i-k:i - 1) = ones(1, k) * NaN;    
     else 
     out(i-k: i - 1) = interp1();%TODO: call interp1 with right params 
     end 
     out(i) = v(i) 
     k = 0 

    else 
     k = k + 1 % number of consecutive NaN value encoutered so far 
    end 

end 
+1

'k'在第一次运行时未定义,什么是'interpl()'? – Dan

+0

谢谢你的回答=) – jjepsuomi