首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >考虑列起始点的累积矩阵

考虑列起始点的累积矩阵
EN

Stack Overflow用户
提问于 2017-01-26 17:27:40
回答 1查看 50关注 0票数 1

我有一个简单的示例数据集如下:

代码语言:javascript
运行
复制
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会给出以下输出:

代码语言:javascript
运行
复制
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

然后计算一个行平均值,结果如下:

代码语言:javascript
运行
复制
nanmean(a,2)

1
2
2.5
3
4

我希望能够解释不同列开始较晚的事实,即行(3:5)的行平均值相对于它们的真实值是减少的,这是由于列(4:5)中的数字较低。

我希望通过将矩阵(a)中每一列中第一个数值元素上方的最后一个NaN替换为累积matrix.This中该行中其他列的平均值,这需要迭代地完成以反映累积矩阵中不断变化的值。因此,新矩阵首先看起来如下所示:

代码语言:javascript
运行
复制
(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 

这将导致:

代码语言:javascript
运行
复制
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)将等于:

代码语言:javascript
运行
复制
(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     

这将导致:

代码语言:javascript
运行
复制
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   

它将给出所需的行均值,如下所示:

代码语言:javascript
运行
复制
nanmean(a,2)

1
2
3
4
5
EN

Stack Overflow用户

发布于 2017-01-26 19:52:25

也许有一种方法可以进一步向量化。但是,我认为因为每一行都依赖于前面的值,所以您必须逐行更新矩阵,如下所示:

代码语言:javascript
运行
复制
% 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个步骤(行数)。

编辑:同样,

代码语言:javascript
运行
复制
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);
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41870324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档