2016-06-08 58 views
0
a = { [5 5 5 6 ] [ Nan Nan Nan Nan]; [ 7 8 8 8 ] [1 2 3 5] } 

我想[1 1 1 1 ]在單元陣列替換楠由許多用Matlab

更換a{1,2}是否有可能?因爲我試過這個功能:

function k = non(a) 
[l ,c ] = size(a); 

for i= 1 : l 

    for j =1 : c 
    if a{i,j} == [ NaN NaN NaN NaN ] 
      k{i,j} = [ 1 1 1 1] 
    else 
      k{i,j} = a{i,j} ; 
    end 
    end 
end 
end 

但它不起作用。

+0

你應該使用'ISEQUAL(一{I,J},[爲NaN,NaN的不同,NaN,NaN的])的',而不是'一{我, j} == [NaN,NaN,NaN,NaN]'。還有其他方法可以改進此代碼,但您應該先嚐試一下。 –

+1

@ ParagS.Chandakkar:不,你不能用'NaN's做這個!一個'NaN'值永遠不會等於任何東西,甚至不是它本身!嘗試'isequal(NaN,NaN)',你會發現它是False(0)!你可能想到'isnan()'。 – gariepy

+0

@gariepy我知道......當我寫這篇文章時,我不明白我在想什麼! –

回答

2

您可以定義簡單的函數:

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 
0

甚至更​​短的是這樣的:

a(cellfun(@(cell) any(isnan(cell(:))),a))={[1 1 1 1]};