前言
昨天在使用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
元素所在的位置,二维数组的使用同理。