我有一个简单的示例矩阵如下:(我正在处理的实际矩阵是674x11,而不仅仅是所有' 1'元素。)
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
我想创建一个累积矩阵,它考虑了数字元素在不同行的每列中开始的事实。我想通过将每列中第一个数字元素上方的NaN值替换为该行的平均值来实现此目的。
所以而不是:
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
我想要实现的目标是:
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
其中元素(2,4)是a(2,1:3)的平均值,元素(3,5)是a(3,1:4)的平均值。
答案 0 :(得分:1)
您可以使用NaN
计算每行的平均值(忽略nanmean
值)。然后,我们可以使用find
来标识每个NaN
所在的行,并将值替换为该行的平均值。然后我们可以使用cumsum
操作
% Get the rows of each NaN value
bool = isnan(a);
[row,col] = find(bool);
% Compute the mean value of each row
rowmeans = nanmean(a, 2);
% Replace the NaN values with their row means
a(bool) = rowmeans(row);
% Perform the cumulative sum
result = cumsum(a);
如果您希望之后将初始NaN
值保留为NaN
值,则可以使用
result(bool) = NaN;