【问题标题】:Adding 2x2 matrix with NaNs使用 NaN 添加 2x2 矩阵
【发布时间】:2012-07-02 19:06:04
【问题描述】:

更多的是一般性的 MATLAB 问题,而不是寻找编程建议——如果我有的话:

y = cellfun(@(x)sum(x(:)), Z, 'un', 0);

每个单元格矩阵中都有NaN 和实数的组合,当我对每个单元格中这些矩阵的所有元素求和时,我总是会得到总计 = NaN,因为有 NaN 的在那里,或者他们会被忽略,只是对实数求和。我问的原因是因为我得到:

y = [NaN] [NaN] [NaN]
    [NaN] [NaN] [NaN]
    [NaN] [NaN] [NaN]

一个示例单元矩阵(单元元素)将是:

x{1,1} = NaN 2   3
         4   5   6
         7   8   9

所以我希望y 的第一个元素是:

y{1,1} = 44

我怎么没有得到这个?

【问题讨论】:

    标签: matlab sum nan


    【解决方案1】:

    您应该使用nansum(来自统计工具箱)而不是sum

    如果您没有统计工具箱,那么您可以通过以下方式轻松定义nansum

    function x = nansum(array,dim)
    
    if nargin < 2
        if size(array,1) == 1
            dim = 2;
        else
            dim = 1;
        end
    end
    
    array(isnan(array)) = 0;
    
    x  = sum(array,dim);
    

    本质上,问题在于sum 试图对输入向量的每个元素求和。如果其中一个元素是NaN,那么整个总和就是NaN(您可以将NaN 视为代表未知数据 - 显然,如果您不知道其中一个数据是什么,那么您可以'也不知道所有数据的总和是多少)。

    函数nansum 将所有缺失数据视为零,因此以下代码给出了您期望的结果:

    >> nansum( [NaN 2 3 4 5 6 7 8 9] )
    ans =
        44
    

    【讨论】:

      【解决方案2】:

      如果您没有统计工具箱,则应使用文件交换中的ignoreNan

         ignoreNan(array,@sum,dim)
      

      在你的情况下,你应该先重塑矩阵:

         ignoreNan(x(:),@sum);
      

      它也比nansum 更通用,因为它可以用于任何功能——无论是自定义的还是内置的。

      【讨论】:

        【解决方案3】:

        要忽略 NaN,只需在匿名函数中使用向量索引,即替换冒号 (:)
        ~isnan(x):

        @(x)sum(x(~isnan(x)))
        

        所以你得到:

        y = cellfun(@(x)sum(x(~isnan(x))), Z, 'un', 0);
        

        【讨论】:

        • y = cellfun(@(x) {sum(x(~isnan(x)))} , Z);更具可读性。查看stackoverflow.com/questions/9044712/…
        • 它允许在运行 cellfun 时返回单元格数组输出。 - 查看上面的链接
        • @Andrey 感谢您的信息。我想我现在会坚持我的答案,因为它改变了 OP 的原始语法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 2018-12-09
        • 2014-09-05
        • 1970-01-01
        • 2010-12-28
        相关资源
        最近更新 更多