2017-06-28 90 views
3

我正在嘗試計算矩陣多列上的移動平均值。在閱讀了一些關於stackoverflow的答案之後,即this之一,似乎filter函數是要走的路。但是,它不會忽略NaN元素,我想這樣做會忽略NaN元素的本質,函數nanmean。以下示例代碼:忽略NaN的移動平均值

X = rand(100,100); %generate sample matrix 
X(sort(randi([1 100],1,10)),sort(randi([1 100],1,10))) = NaN; %put some random NaNs 
windowlenght = 7; 
MeanMA = filter(ones(1, windowlenght)/windowlenght, 1, X); 
+0

爲了清楚起見,你想保留NaNs在他們各自的位置,只是爲了各種意思的目的而忽略它們,而不是完全移除它們並採取結果的滾動平均值? –

+1

這是正確的。因此,如果連續有7個NaN,則得到的平均值應該是NaN。如果存在序列[NaN NaN NaN NaN NaN 5 10],則所得平均值應爲7.5。 – phdstudent

+0

我認爲你不能使用過濾器,並可能需要循環思考這一點。由於FFT的特性,您可以使用濾波器,但是沒有NaN的數學公式。 –

回答

0

嘗試

MeanMA = filter(ones(1, windowlenght)/windowlenght, 1, X(find(~isnan(X))); 

這將從X.

問題提取非NaN值是...你仍然有一個有效的濾波處理?如果迭代地填充X,每個時間步長一個元素,則「NaN消除」將產生更短的向量,其值不再與原始時間向量對齊。

EDIT

要仍具有有效的平均值計算,過濾器參數必須根據非NaN值的數量進行更新。

values = X(find(~isnan(X)); 
templength = length(values); 
MeanMA = filter(ones(1, templength)/templength , 1, values); 
+0

感謝您的回答。我確實需要將MeanMA結果向量與原始向量X對齊。 – phdstudent

+0

窗口長度又如何?你不必將它設置爲可能縮短的矢量的長度嗎? – Loamsiada

+0

看到我上面的評論。假設窗口是7,在那個窗口中,矢量是[NaN NaN NaN NaN NaN 5 10],然後與10對齊,我應該有7.5的平均值。 – phdstudent

1

使用colfiltnanmean

>> A = [1 2 3 4 5; 2 nan nan nan 6; 3 nan nan nan 7; 4 nan nan nan 8; 5 6 7 8 9] 

A = 

    1  2  3  4  5 
    2 NaN NaN NaN  6 
    3 NaN NaN NaN  7 
    4 NaN NaN NaN  8 
    5  6  7  8  9 

>> colfilt(A, [3,3], 'sliding', @nanmean)          

ans = 

    0.6250 1.1429 1.5000 2.5714 1.8750 
    1.1429 2.2000 3.0000 5.0000 3.1429 
    1.5000 3.0000  NaN 7.0000 3.5000 
    2.5714 5.0000 7.0000 7.8000 4.5714 
    1.8750 3.1429 3.5000 4.5714 3.1250 

(如果你只關心 '全' 塊,選擇裏面的行/恰當列)

另外,您還可以使用nlfilter,但那麼你需要明確地(通過一個匿名函數句柄)來說明你將如何處理這個塊;特別是,與nanmean工作,從而會產生從整個塊一個標量輸出,你需要在你的匿名函數調用nanmean之前,每個塊轉換成列向量:

>> nlfilter(A, [3,3], @(x) nanmean(x(:))) 

ans = 

    0.6250 1.1429 1.5000 2.5714 1.8750 
    1.1429 2.2000 3.0000 5.0000 3.1429 
    1.5000 3.0000  NaN 7.0000 3.5000 
    2.5714 5.0000 7.0000 7.8000 4.5714 
    1.8750 3.1429 3.5000 4.5714 3.1250 

然而,爲了記錄,matlab聲明colfilt通常會更快,所以通常nlfilter更適合在處理每個塊時將輸入轉換爲列時沒有意義的情況。

另請參閱matlab的手冊頁/關於sliding operations in general的章節。