【问题标题】:Cumulative matrix which accounts for column start points占列起点的累积矩阵
【发布时间】:2017-06-11 17:44:20
【问题描述】:

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

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 给出以下输出:

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

然后计算行平均值给出:

nanmean(a,2)

1
2
2.5
3
4

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

我想通过将矩阵 (a) 中每一列中第一个数字元素上方的最后一个 NaN 替换为累积矩阵中该行中其他列的平均值来实现这一点。这需要迭代地完成反映累积矩阵中的变化值。所以新矩阵首先看起来如下:

(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 

这会导致:

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) 将等于:

(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     

这会导致:

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   

这将给出所需的行意味着值:

nanmean(a,2)

1
2
3
4
5

【问题讨论】:

    标签: matlab sorting matrix cumsum


    【解决方案1】:

    可能有一种方法可以进一步矢量化。但是,我认为因为每一行都取决于以前的值,所以您必须逐行更新矩阵,如下所示:

    % 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(行数)。

    编辑:同样,

    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);
    

    【讨论】:

    • 感谢您的回答,这似乎适用于上述示例。但是,我的实际数据要复杂得多。仅在稍微复杂的数据集上使用您的代码,例如a = [1 1 1 NaN NaN; 2 2 2 南3 3 3 1 南; 4 4 4 2 1; 5 5 5 3 2];导致错误的结果。
    • 别担心,我已经设法找到解决问题的解决方法。为您的帮助干杯。
    • 好吧@Matt,不过我还是很好奇你到底期待什么结果!您可以发布并接受您自己问题的答案,以防将来也对其他人有所帮助。
    猜你喜欢
    • 2017-06-10
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多