讓我們假設我有以下陣列:發現NaN值是單元陣列
a = {1; 'abc'; NaN}
現在我想找出其中指數這包含NaN的,這樣我就可以取代這些與「」(空字符串) 。
如果我使用cellfun
與isnan
我得到一個無用輸出
cellfun(@isnan, a, 'UniformOutput', false)
ans =
[ 0]
[1x3 logical]
[ 1]
所以,我會怎麼做這正確嗎?
讓我們假設我有以下陣列:發現NaN值是單元陣列
a = {1; 'abc'; NaN}
現在我想找出其中指數這包含NaN的,這樣我就可以取代這些與「」(空字符串) 。
如果我使用cellfun
與isnan
我得到一個無用輸出
cellfun(@isnan, a, 'UniformOutput', false)
ans =
[ 0]
[1x3 logical]
[ 1]
所以,我會怎麼做這正確嗎?
事實上,正如你發現自己,這可以通過
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}
之間的差異讀了。
我找到了答案上http://www.mathworks.com/matlabcentral/answers/42273
a(cellfun(@(x) any(isnan(x)),a)) = {''}
不過,我不understant它...
a(ind) = []
將來自陣列a(ind)= {''}
刪除這些項將與空字符串替換NaN
。如果要刪除條目使用= []
而不是= {''}
。
如果你想用不同的值來代替NaN
的只有我將其設置爲使用大括號該值:
a(ind) = {value}
如果'x'是一個矩陣,您需要更改匿名函數來'@( x)的任何(任何(isnan(X)))'(即加上'any'第二次,以確保您從功能得到一個標量))。 – 2014-12-11 02:44:15
@ peci1:你說得對。實際上,更一般地說,最好是執行'any(isnan(x(:))',它適用於任何維度的數組,並且只調用一次'any'。 – 2014-12-11 05:10:38