占列开始点的累积矩阵

时间:2017-01-26 09:27:40

标签: matlab sorting matrix cumsum

我在下面有一个简单的示例数据集:

a = 

 1 1 1 NaN NaN
 1 1 1 NaN NaN
 1 1 1 1 NaN
 1 1 1 1 1
 1 1 1 1 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

我希望能够解释以下事实:不同的列稍后开始,即行(3:5)的行平均值相对于它们的真值减少,因为列(4: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)等于:

(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

1 个答案:

答案 0 :(得分: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);