您可以定義簡單的函數:
function matrix = replace_nan(matrix, value)
matrix(isnan(matrix)) = value;
end
,然後用cellfun超過執行它的單元陣列的所有元素(我稍微允許您定義value
爲數字廣義你的問題與更換NaN,並且使元件可變長度):
>> a = {[ 3 NaN] [NaN NaN NaN] [1 2 3 4 5 NaN 0 NaN]};
>> value = 1; %% the value to replace the NaN with
>> z = cellfun(@replace_nan, a, repmat({value}, size(a,1), size(a,2)) , 'UniformOutput', 0);
>> z{1}
ans =
3 1
>> z{2}
ans =
1 1 1
>> z{3}
ans =
1 2 3 4 5 1 0 1
對使用cellfun
這裏幾點意見:cellfun
取一個函數,在這種情況下replace_nan
和單元陣列,在這種情況下爲a
,並將函數調用重複爲replace_nan()
。如果replace_nan
是單參數函數,我們可以說cellfun(@replace_nan, a)
,但我定義它的方式,該函數有兩個參數。在cellfun中指定的方法是提供第二個單元陣列,其中包含參數value
。這是repmat({1},size(a,1),size(a,2))
,它創建了與a
相同尺寸但填充了1
的第二個單元陣列。
編輯:評論討論帶來了一個好處:你不能使用==
來測試NaN
,你必須使用MATLAB的isnan()
函數。
>> [NaN NaN] == [NaN NaN]
ans =
0 0
>> isnan([NaN NaN])
ans =
1 1
你應該使用'ISEQUAL(一{I,J},[爲NaN,NaN的不同,NaN,NaN的])的',而不是'一{我, j} == [NaN,NaN,NaN,NaN]'。還有其他方法可以改進此代碼,但您應該先嚐試一下。 –
@ ParagS.Chandakkar:不,你不能用'NaN's做這個!一個'NaN'值永遠不會等於任何東西,甚至不是它本身!嘗試'isequal(NaN,NaN)',你會發現它是False(0)!你可能想到'isnan()'。 – gariepy
@gariepy我知道......當我寫這篇文章時,我不明白我在想什麼! –