更不是找编程建议一般的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
为什么我没有得到这个?
要忽略NaN的,只是使用矢量索引在您的匿名功能,通过更换冒号( :
)
用~isnan(x)
@(x)sum(x(~isnan(x)))
所以,你得到:
y = cellfun(@(x)sum(x(~isnan(x))), Z, 'un', 0);
您应该使用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
如果你没有统计工具箱,你应该使用ignoreNan
从文件交换。
ignoreNan(array,@sum,dim)
在你的情况,你应该首先重塑矩阵:
ignoreNan(x(:),@sum);
它也比更通用nansum
,在这个意义上,它可以用于任何功能-无论是定制或内置。