2017-06-07 100 views
0

我使用xlsread來讀取xlsx文件。我期望rawdata將返回一個34x3單元陣列。xlsread在Matlab中即使Excel中沒有數據也會返回NaN

[raw_num raw_txt rawdata]=xlsread('file.xlsx'); 

raw_numraw_txt返回正確的值,34x1單元陣列和34x2單元陣列。

但是,當我檢查rawdata時,它返回139x6單元陣列。它不僅包含Excel文件中的數據,還包含NaN元素。對於NaN元素,excel文件中沒有數據。我只能假設我可能會輸入一些內容,然後刪除它。但爲什麼matlab讀取它?

的RAWDATA看起來是這樣的:

'a' 'b' 'c' NaN NaN

'd' 'e' 'f' NaN NaN

NaN NaN NaN NaN NaN

我怎樣才能避免這種情況,當我使用xlsread?

或者我得到這個矩陣後如何去除NaN?

感謝您的幫助

回答

0

如果NaN元素一樣顯示在你的榜樣,你可以先用所有NaN刪除行,然後刪除所有NaN的列。

% test data 
A = {NaN, NaN, NaN, NaN; NaN, NaN, NaN, NaN; NaN, NaN, NaN, NaN}; 
A{1, 1} = 'a'; 
A{1, 2} = 'b'; 
A{2, 1} = 'c'; 
A{2, 2} = 'd'; 

fh = @(x) all(isnan(x)); 
% remove rows with all NaN 
A(all(cellfun(fh, A),2),:) = []; 
% remove columns with all NaN 
A(:,all(cellfun(fh, A),1)) = []; 

你必須做這種方式的原因是因爲cellfun不保留尺寸,所以你必須在每個維度單獨運行它。或者,你可以寫一個for循環。

+0

all(cellfun(fh,A))只在第一行返回NaN的邏輯。因此,當矩陣A中的NaN在行和列中不相同時,此代碼無法正確執行。例如,我將A更改爲3x4單元格:A = {NaN,NaN,NaN,NaN; NaN,NaN,NaN,NaN; NaN,NaN,NaN,NaN}; A {1,1} ='a'; A {1,2} ='b'; A {2,1} ='c'; A {2,2} ='d';那麼A(所有(cellfun(fh,A)),:) = []將顯示錯誤 – chshiu

+0

我認爲它應該是:fh = @(x)all(isnan(x)); a1 = cellfun(fh,A); A(a1(:,1),:)= []; A(:,a1(1,:))= []; – chshiu

+0

查看編輯後的代碼 –

0

您可以刪除NaN的象下面這樣:僅在矩陣的邊緣

k = {'a' 'b' 'c' NaN NaN} 
k(cellfun(@isnan, k)) = [] ; 
+0

就我而言,我被要求將UniformOutput設置爲false。但是當我使用「rawdata(cellfun(@isnan,rawdata,'UniformOutput',false))= [];」我得到一個錯誤:函數'subsindex'沒有定義類'cell'的值。 – chshiu

+0

你的版本是? –

+0

matlab是R2015b – chshiu

相關問題