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
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. –
@ 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
@gariepy Ich weiß ... Ich verstehe nicht, was ich dachte, als ich das schrieb! –