Matlab:定位Cell数组中的NaN

前言

昨天在使用Matlab读取Excel数据时,发现在读取时Matlab会将空白数据读取为NaN,将其它数据以字符串的形式进行存储,最终的结果为一个二维的Cell数组。然而,在去除数组中的NaN数据时,遇到了麻烦。在查阅了各方资料后,才发现了解决方法,在这里记录一下。

正文

这里以一个以为的Cell为例,二维数组也是一样的用法:

a={'q','b',NaN,'ad'};

如果我们使用isnan函数来判断的话,会出现错误:

isnan(a(1))
error: Undefined function 'isnan' for input arguments of type 'cell'.

由于cell类型无法使用=来判断,而isnan又出错。为了解决这个问题,经过在网上各方百度,大多采用下面一种方法:

%方法一:
% 找到内容为 NaN 的元胞,是NaN相应位置置1,否则置0;
temp1=cellfun(@(x) sum(isnan(x)),a,'uniformoutput',false);
% 将cell数组转换成double数组
temp2=cell2mat(temp1);
% 找到值为1的元素
index=find(temp2==1);% 将相应位置的NaN换成想要的字符,比如空格 {' '}

index即是NaN元素所在的位置,这样就可以解决这个问题了。
后来在思考这个问题的时候,发现了之前isnan不能使用的原因,取cell数组元素时应该使用{}而不是()。所以isnan的正确用法为:

isnan(a{1})

cellfun方法在取元素时就是以{}来取的。由此,可得到第二种方法为:

%方法二:
% 找到内容为 NaN 的元胞,是NaN相应位置置1,否则置0;
temp1=cellfun(@(x) length(find(isnan(x))),a,'uniformoutput',false);%此行不同
% 将cell数组转换成double数组
temp2=cell2mat(temp1);
% 找到值为1的元素
index=find(temp2==1);% 将相应位置的NaN换成想要的字符,比如空格 {' '}

index即是NaN元素所在的位置,二维数组的使用同理。

    原文作者:Atomwh
    原文地址: https://www.jianshu.com/p/d0fbffe8148b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞