我在下面有一个简单的示例数据集:
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
答案 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);