添加2x2矩阵与NaNs

时间:2012-07-02 11:10:00

标签: matlab sum nan

比查找编程建议更多的一般MATLAB问题 - 如果我有:

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

在每个单元矩阵中有NaN和实数的组合,当我对每个单元格的所有矩阵求和时,我总是得到总数= NaN,因为{ {1}}在那里,或者他们会被忽略,只是将实数相加。我问的原因是因为我得到了:

NaN

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

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

所以我希望x{1,1} = NaN 2 3 4 5 6 7 8 9 的第一个元素是:

y

我怎么没有得到这个?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

   ignoreNan(array,@sum,dim)

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

   ignoreNan(x(:),@sum);

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

答案 2 :(得分:2)

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

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

所以你得到:

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