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

ich will a{1,2} ersetzen durch [1 1 1 1 ]Nan durch eine Zahl in einem Zellenfeld mit Matlab

Ist es möglich? weil ich diese funktion probiert habe:

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 

aber es funktioniert nicht.

+0

sollten Sie 'isequal verwenden (a {i, j} [NaN, NaN, NaN, NaN])' statt 'a {i, j} == [NaN, NaN, NaN, NaN]. Es gibt andere Möglichkeiten, diesen Code zu verbessern, aber Sie sollten das zuerst versuchen. –

+1

@ ParagS.Chandakkar: Nein, das kannst du nicht mit 'NaN's machen !! Ein 'NaN'-Wert ist niemals gleich, nicht einmal selbst! Probieren Sie 'isequal (NaN, NaN)' und Sie werden sehen, es ist Falsch (0)! Sie denken möglicherweise an 'isnan()'. – gariepy

+0

@gariepy Ich weiß ... Ich verstehe nicht, was ich dachte, als ich das schrieb! –

Antwort

2

Sie können die folgende einfache Funktion definieren:

function matrix = replace_nan(matrix, value) 
    matrix(isnan(matrix)) = value; 
end 

und dann cellfun verwenden sie alle Elemente des Zellenfeldes auszuführen über (ich habe Ihr Problem leicht verallgemeinert, indem Sie value als die Zahl definieren ersetzen Sie die NaN mit, und die Elemente mit variabler Länge) zu machen:

>> 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 

ein paar Anmerkungen über die Verwendung von cellfun hier: cellfun nimmt eine Funktion, in diesem Fall replace_nan und ein Zellenfeld, in diesem Fall a, und führt den Funktionsaufruf zu replace_nan(). Wenn replace_nan eine einzelne Argumentfunktion wäre, könnten wir cellfun(@replace_nan, a) sagen, aber wie ich es definiert habe, benötigt die Funktion zwei Argumente. Die Angabe in cellfun besteht darin, ein zweites Zellenarray mit den Argumenten value bereitzustellen. Das ist die repmat({1},size(a,1),size(a,2)), die ein zweites Zellenfeld mit den gleichen Abmessungen wie a erstellt, aber mit 1 gefüllt ist.

EDIT: Die Kommentar-Diskussion bringt einen guten Punkt: Sie können == nicht verwenden, um für NaN zu testen, müssen Sie MATLAB isnan() Funktion verwenden.

>> [NaN NaN] == [NaN NaN] 
ans = 
    0  0 
>> isnan([NaN NaN]) 
ans = 
    1  1 
0

Oder noch kürzer so:

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