比查找编程建议更多的一般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
我怎么没有得到这个?
答案 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);