更多的一般MATLAB问题而不是寻找编程建议 - 如果我有:
y = cellfun(@(x)sum(x(:)), Z, 'un', 0);
Run Code Online (Sandbox Code Playgroud)
NaN在每个单元矩阵中存在's'和实数的组合时,当我对每个单元格中的所有矩阵的所有元素求和时,我总是得到total = NaN因为那里NaN有,或者它们会被忽略而只是求和实数.我问的原因是因为我得到了:
y = [NaN] [NaN] [NaN]
[NaN] [NaN] [NaN]
[NaN] [NaN] [NaN]
Run Code Online (Sandbox Code Playgroud)
示例单元矩阵(单元元素)将是:
x{1,1} = NaN 2 3
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)
所以我希望第一个元素y是:
y{1,1} = 44
Run Code Online (Sandbox Code Playgroud)
我怎么没有得到这个?
您应该使用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);
Run Code Online (Sandbox Code Playgroud)
本质上,问题是sum尝试对输入向量的每个元素求和.如果其中一个元素是NaN整个总和NaN(你可以认为NaN代表未知数据 - 显然如果你不知道其中一个数据是什么,那么你就不知道所有部分的总和是多少数据也是).
该函数nansum将所有缺失的数据视为零,因此以下代码给出了您期望的结果:
>> nansum( [NaN 2 3 4 5 6 7 8 9] )
ans =
44
Run Code Online (Sandbox Code Playgroud)