2013-04-17 33 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