用NaN填充的2x2矩阵相加

3

我需要翻译的内容是关于IT技术的,以下是具体内容:

这更像是一个普通的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

我怎么就是没弄懂呢?

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

3

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

   ignoreNan(array,@sum,dim)

在您的情况下,您需要首先重塑矩阵:
   ignoreNan(x(:),@sum);

这个函数比nansum更加通用,可以用于任何函数,无论是自定义的还是内置的。


2

要忽略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); 更易读。请查看http://stackoverflow.com/questions/9044712/applying-a-function-on-array-that-returns-outputs-with-different-size-in-a-vecto - Andrey Rubshtein
当运行cellfun时,它允许返回单元数组输出。- 请查看上面的链接。 - Andrey Rubshtein
@Andrey 谢谢你的信息。目前我想坚持我的答案,因为它对 OP 的原始语法更改较少。 - Eitan T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接