2013-06-04 48 views
2

我現在遇到了Matlab的一些麻煩。我目前正試圖從一個大型Cell Array中移除所有的NaN,我有3806 x 122.我一直在尋找類似問題的解決方案,並且我想出了。當我嘗試清除NaN時,Cellfun正在重新排序我的矩陣

data(cellfun(@(x) any(isnan(x(:))), data)) = []; 

我的基質是一種奇怪的,因爲它看起來像這樣

(ex). 
1 2 3 4 5 5 NaN 
6 5 2 5 6 7 NaN 
2 3 4 5 6 7 NaN 
NaN NaN NaN NaN NaN NaN NaN 

我的問題是,當我申請的上述代碼行到我的陣列我得到的這個沒有NaN的輸出。

1 2 3 4 5 5 6 5 2 5 6 7 2 3 4 5 6 7 etc... 

我不明白它爲什麼這樣做。我也必須小心刪除列,因爲每列都有相應的標題,我不想混淆它們。如果我能以某種方式索引哪些列和行具有NaN,那將會很有幫助,所以我可以用它們刪除相應的標題。

最後,我想把標題和數據放到一個看起來像這樣的數據集結構中。

(ex). 
'title1' 'title2' 'title3' 'title4' 'title5' 'title6' 
1   2   3   4   5   5 
6   5   2   5   6   7 
2   3   4   5   6   7 

任何幫助,非常感謝。

問候, 喬納森

+0

'NaN'會一直在最後一行和最後一列,還是它們四處蔓延?有數字和'Nan'的行/列(除了最後一行/列)? –

+0

Robert,NaN的絕大多數都位於陣列的底部和側面,就像上面顯示的那樣,但NaN的一些列分散在整個數據中。 –

回答

1

如果每個單元僅包含一個元素,你可以使用的cellfun(@isnan, data) 代替cellfun(@(x) any(isnan(x(:))), data)

如果您確信總有行或列全的NaN,那麼你可以使用第一行和列索引

I = ~cellfun(@isnan, data); 
data = data(I(:,1), I(1,:)); 

邏輯索引的,你可以使用I(1,:)索引標題爲好。 更有效的方法將是

Irow = ~cellfun(@isnan, data(:,1)); 
Icol = ~cellfun(@isnan, data(1,:)); 
data = data(Irow, Icol); 
+0

感謝您的幫助。這只是我需要的東西! –

0

我相信還有比這更好的方法,但這裏是我想出了。在我的例子中,我用空的條目替換了非空條目,但你應該能夠調整你的情況。

d = cell(10,4); 
d{1} = 5; 
d{4} = 10; 
d 
ix = cellfun(@(x) numel(x)>0,d); 
d(ix) = cell(1,numel(sum(ix(:)))); 
d 
相關問題