2016-06-19 41 views
0

我有一個包含一些NaN值的500x600矩陣。我想插入少於三個NaN(可能是前面的,後面的值的平均值)的地方,並且對於其中存在超過3個連續的NaN值的所有其他地方,我想將它們留作Nan值。我已經看過http://uk.mathworks.com/matlabcentral/answers/34481-interpolate-nans-only-if-less-than-4-consecutive-nans,但即使接受的答案也不起作用。 (我意識到這是一個連續4個值,但它不能以任何方式工作)。如何在Matlab中只插入少於3個連續的Nan值?

+0

你的意思是一排連續3個NaN的?在col?都?對角線也很重要? – drorco

+0

@Ibezito我很抱歉,我不清楚這個問題。我已經嘗試過,它效果很好。我已經在我的矩陣上試過了,看起來像這樣的代碼可以同時行和列嗎?我對嗎? – Darkgod

+0

是的,你是對的。祝你好運! – drorco

回答

0

如果寫你的意思是在一行或一列連續3個NaN的3周連續的NaN,你可以用下面的辦法:

  1. 對於每一行,使用卷積確定的NaN每個序列,如果其短比3.
  2. 使用following approach來填充矩陣中的每一行。
  3. 通過轉置結果並再次執行該函數來填充列。

代碼:

%generates example array 
data = rand(5,5); 
data (1,2:4) = nan; 
data (2:5,2) = nan; 
data (:,4) = nan; 

%fills all relevan nans in a row 
data2 = interpolateNanRows(data); 
%fills all relevant nans in a column 
out= interpolateNanRows(data2')'; 

輔助功能:

function res = interpolateNanRows(data) 
%zero padding 
dataPad = zeros(size(data,1)+2,size(data,2)+2); 
dataPad(2:end-1,2:end-1)=data; 

%generates relevant nan maps 
nansMap = isnan(dataPad); 
irrelevantNans = conv2(double(nansMap),[1,0,0,0,1],'same')>0 & nansMap; 

%fills each row 
for ii=1:size(dataPad,1) 
    filledRow = interpolateRow(dataPad(ii,:)); 
    %ignores irrelevant values (more than 3 consecutive nans) 
    filledRow(irrelevantNans(ii,:)) = nan; 
    dataPad(ii,:) = filledRow; 
end 
%generates output 
res = dataPad(2:end-1,2:end-1); 
end 


function filledRow = interpolateRow(row) 
%receives a vector of values, and perform interpolation in regions of nans 
if sum(isnan(row))==0 || sum(isnan(row))==length(row) 
    filledRow = row; 
    return; 
end 
nanData = isnan(row); 
index = 1:numel(row); 
filledRow = row; 
filledRow(nanData) = interp1(index(~nanData), row(~nanData), index(nanData)); 

end 

結果:

data2= 
0.6386  NaN  NaN  NaN 0.6671 
0.4805  NaN 0.3171  NaN 0.7771 
0.1184  NaN 0.0124  NaN 0.6860 
0.2455  NaN 0.3011  NaN 0.8014 
0.7761  NaN 0.7239  NaN 0.2833 


out = 

0.6386 0.6457 0.6528 0.6599 0.6671 
0.4805 0.3988 0.3171 0.5471 0.7771 
0.1184 0.0654 0.0124 0.3492 0.6860 
0.2455 0.2733 0.3011 0.5512 0.8014 
0.7761 0.7500 0.7239 0.5036 0.2833