前言
昨天在使用Matlab讀取Excel數(shù)據(jù)時(shí),發(fā)現(xiàn)在讀取時(shí)Matlab會(huì)將空白數(shù)據(jù)讀取為NaN,將其它數(shù)據(jù)以字符串的形式進(jìn)行存儲(chǔ),最終的結(jié)果為一個(gè)二維的Cell數(shù)組。然而,在去除數(shù)組中的NaN數(shù)據(jù)時(shí),遇到了麻煩。在查閱了各方資料后,才發(fā)現(xiàn)了解決方法,在這里記錄一下。
正文
這里以一個(gè)以為的Cell為例,二維數(shù)組也是一樣的用法:
a={'q','b',NaN,'ad'};
如果我們使用isnan函數(shù)來(lái)判斷的話,會(huì)出現(xiàn)錯(cuò)誤:
isnan(a(1))
error: Undefined function 'isnan' for input arguments of type 'cell'.
由于cell類型無(wú)法使用=來(lái)判斷,而isnan又出錯(cuò)。為了解決這個(gè)問(wèn)題,經(jīng)過(guò)在網(wǎng)上各方百度,大多采用下面一種方法:
%方法一:
% 找到內(nèi)容為 NaN 的元胞,是NaN相應(yīng)位置置1,否則置0;
temp1=cellfun(@(x) sum(isnan(x)),a,'uniformoutput',false);
% 將cell數(shù)組轉(zhuǎn)換成double數(shù)組
temp2=cell2mat(temp1);
% 找到值為1的元素
index=find(temp2==1);% 將相應(yīng)位置的NaN換成想要的字符,比如空格 {' '}
index即是NaN元素所在的位置,這樣就可以解決這個(gè)問(wèn)題了。
后來(lái)在思考這個(gè)問(wèn)題的時(shí)候,發(fā)現(xiàn)了之前isnan不能使用的原因,取cell數(shù)組元素時(shí)應(yīng)該使用{}而不是()。所以isnan的正確用法為:
isnan(a{1})
cellfun方法在取元素時(shí)就是以{}來(lái)取的。由此,可得到第二種方法為:
%方法二:
% 找到內(nèi)容為 NaN 的元胞,是NaN相應(yīng)位置置1,否則置0;
temp1=cellfun(@(x) length(find(isnan(x))),a,'uniformoutput',false);%此行不同
% 將cell數(shù)組轉(zhuǎn)換成double數(shù)組
temp2=cell2mat(temp1);
% 找到值為1的元素
index=find(temp2==1);% 將相應(yīng)位置的NaN換成想要的字符,比如空格 {' '}
index即是NaN元素所在的位置,二維數(shù)組的使用同理。