我有一个简单的示例数据集如下:
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替换为累积matrix.This中该行中其他列的平均值,这需要迭代地完成以反映累积矩阵中不断变化的值。因此,新矩阵首先看起来如下所示:
(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
发布于 2017-01-26 19:52:25
也许有一种方法可以进一步向量化。但是,我认为因为每一行都依赖于前面的值,所以您必须逐行更新矩阵,如下所示:
% 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);
https://stackoverflow.com/questions/41870324
复制相似问题