【问题标题】:Creating cumulative matrix which accounts for column start points创建占列起点的累积矩阵
【发布时间】:2017-06-10 19:16:35
【问题描述】:

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

【问题讨论】:

  • 您要替换输出中的 all NaN 值吗?
  • 你的例子有问题。不应该是element (2,4) is the mean of cumsum(a)(2,1:3)吗?
  • 其实,仔细想想,你是对的。元素 (2,4) 应该是 cumsum(a) (2,1:3) 的平均值。

标签: matlab sorting matrix cumsum


【解决方案1】:

您可以使用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;

【讨论】:

  • 完美运行!非常感谢!
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多