创建占列起点的累积矩阵

Creating cumulative matrix which accounts for column start points

我有一个简单的示例矩阵,如下所示:(我正在处理的实际矩阵是 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) 的平均值。

您可以使用 nanmean 计算每行的平均值(忽略 NaN 值)。然后我们可以使用 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;