3

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

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

每个单元格矩阵中都有 ' 和实数的组合NaN,当我对每个单元格中这些矩阵的所有元素求和时,我总是会得到 total =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

我怎么没有得到这个?

4

3 回答 3

7

您应该使用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
于 2012-07-02T11:14:05.977 回答
3

如果你没有统计工具箱,你应该ignoreNan从文件交换中使用。

   ignoreNan(array,@sum,dim)

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

   ignoreNan(x(:),@sum);

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

于 2012-07-02T11:18:35.457 回答
2

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

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

所以你得到:

y = cellfun(@(x)sum(x(~isnan(x))), Z, 'un', 0);
于 2012-07-02T11:25:42.697 回答