创建占列起点的累积矩阵
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;
我有一个简单的示例矩阵,如下所示:(我正在处理的实际矩阵是 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;