2012-08-10 21 views
7

讓我們假設我有以下陣列:發現NaN值是單元陣列

a = {1; 'abc'; NaN} 

現在我想找出其中指數這包含NaN的,這樣我就可以取代這些與「」(空字符串) 。

如果我使用cellfunisnan我得到一個無用輸出

cellfun(@isnan, a, 'UniformOutput', false) 

ans = 
[   0] 
[1x3 logical] 
[   1] 

所以,我會怎麼做這正確嗎?

回答

11

事實上,正如你發現自己,這可以通過

a(cellfun(@(x) any(isnan(x)),a)) = {''} 

完成細分:

Fx = @(x) any(isnan(x)) 

將返回一個邏輯標量,無論是否x是一個標量或矢量。 使用內部cellfun這個函數然後將erradicate爲'UniformOutput', false需要:

>> inds = cellfun(Fx,a) 
inds = 
    0 
    0 
    1 

這些可以被用來作爲指標到原來的數組:

>> a(inds) 
ans = 
    [NaN] 

這進而允許分配到這些指數:

>> a(inds) = {''} 
a = 
    [1] 
    'abc' 
    '' 

注意分配必須做一個單元陣列本身。如果你不明白這一點,在a(inds)a{inds}之間的差異讀了。

+0

如果'x'是一個矩陣,您需要更改匿名函數來'@( x)的任何(任何(isnan(X)))'(即加上'any'第二次,以確保您從功能得到一個標量))。 – 2014-12-11 02:44:15

+1

@ peci1:你說得對。實際上,更一般地說,最好是執行'any(isnan(x(:))',它適用於任何維度的數組,並且只調用一次'any'。 – 2014-12-11 05:10:38

2
  • a(ind) = []將來自陣列
  • a(ind)= {''}刪除這些項將與空字符串替換NaN

如果要刪除條目使用= []而不是= {''}
如果你想用不同的值來代替NaN的只有我將其設置爲使用大括號該值:

a(ind) = {value}