-->

添加2×2矩阵的NaN(Adding 2x2 matrix with NaNs)

2019-09-18 22:39发布

更不是找编程建议一般的MATLAB问题 - 如果我有:

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

那里有一个组合NaN的每个小区矩阵,当我总结每个细胞的那些矩阵的所有元素和实数,我将总是得到总= NaN ,因为有NaN “在那里S,或将它们忽略和算了笔实数。 我想问的原因是因为我得到:

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

为什么我没有得到这个?

Answer 1:

要忽略NaN的,只是使用矢量索引在您的匿名功能,通过更换冒号( :
~isnan(x)

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

所以,你得到:

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


Answer 2:

您应该使用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


Answer 3:

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

   ignoreNan(array,@sum,dim)

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

   ignoreNan(x(:),@sum);

它也比更通用nansum ,在这个意义上,它可以用于任何功能-无论是定制或内置。



文章来源: Adding 2x2 matrix with NaNs
标签: matlab sum nan