2017-01-26 67 views
1

下面我有一個簡單的例子,數據集:累積矩陣佔柱起始點

​​

我想工作的每行的平均累計值。然而,cumsum給出了下面的輸出:

cumsum(a) 

1 1 1 NaN NaN 
2 2 2 NaN NaN 
3 3 3 1 NaN 
4 4 4 2 1 
5 5 5 3 2 

然後計算行平均,得出:

nanmean(a,2) 

1 
2 
2.5 
3 
4 

我希望能夠考慮到一個事實,即不同的列開始後,即該行平均值由於列(4:5)中的數字較少,所以行(3:5)相對於它們的真實值被降低。

我想通過將矩陣(a)中每列中第一個數字元素上面的最後一個NaN替換爲累積矩陣中該行其他列的平均值來實現此目的。這需要迭代完成以反映累積矩陣中的變化值。因此,新的矩陣將首先如下所示:

(a) 

1 1 1 NaN NaN 
1 1 1 *2* NaN 
1 1 1 1 NaN 
1 1 1 1 1 
1 1 1 1 1 

,這將導致:

cumsum(a) 

1 1 1 NaN NaN 
2 2 2 2 NaN 
3 3 3 3 NaN 
4 4 4 4 1 
5 5 5 5 2 

,然後反覆,(一)將等於:

(a) 

1 1 1 NaN NaN 
1 1 1 2 NaN 
1 1 1 1 *3* 
1 1 1 1 1 
1 1 1 1 1  

,這將導致:

cumsum(a) 

1 1 1 NaN NaN 
2 2 2 2 NaN 
3 3 3 3 3 
4 4 4 4 4 
5 5 5 5 5 

哪會給出所需的行平均值爲:

nanmean(a,2) 

1 
2 
3 
4 
5 

回答

0

可能有辦法進一步實現這一點。但是,我認爲,因爲各行依賴於前值,你必須更新矩陣的行由行如下:

% Cycle through each row in matrix 
for i = 1:length(a) 

    if i > 1 

     % This makes elements equal to the sum of themselves and above element 
     % Equivalent outcome to cumsum 
     a(i,:) = a(i,:) + a(i-1,:); 

    end 

    % Replace all NaN values in the row with the average of the non-NaN values 
    a(i,isnan(a(i,:))) = mean(a(i,~isnan(a(i,:)))); 

end 

此複製你的輸入和輸出的例子。它不會複製所有迭代步驟,實際上它使用的步驟更少,整個操作只需5(行數)。

編輯:同樣,

for i = 1:length(a) 

    % Replace all NaN values in the row with the average of the non-NaN values 
    a(i,isnan(a(i,:))) = mean(a(i,~isnan(a(i,:)))); 

end  

a = cumsum(a); 
+0

謝謝您的回答,這似乎在上面的例子中工作。但是,我的實際數據要複雜得多。僅在稍微複雜的數據集上使用您的代碼,例如a = [1 1 1 NaN NaN; 2 2 2 NaN NaN; 3 3 3 1 NaN; 4 4 4 2 1; 5 5 5 3 2];導致錯誤的結果。 –

+0

它不正確?你會期待什麼? – Wolfie

+0

別擔心,我已經設法找到解決問題的解決方法。歡呼你的幫助。 –