Effacer les filtres
Effacer les filtres

Replace Nan in array with the previous value/text/number

4 vues (au cours des 30 derniers jours)
babyelephant
babyelephant le 3 Avr 2019
Commenté : Rik le 3 Avr 2019
function A = fill_nans(A)
% Replaces the NaN in each column with
% previous non-NaN values.
for i = 1:size(A,1)
I = A(1,i)
for j = 2:size(A,2)
if cellfun(@isnan,A(i,j))
A(i,j) = I
else
I = A(i,j)
end
end
end
I use this function
data={'Robert',NaN,5,6,7,8,NaN,NaN,NaN};
fill_nans(data) %working ok
data2={'Robert','pai',NaN,5,6,7,8,NaN,NaN,NaN};
fill_nans(data2) %Not working error is
data3={'Robert',NaN,NaN,5,6,7,8,'pai',NaN,NaN,NaN};
fill_nans(data2) %Not working error is
Error using cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.
Error in fill_nans (line 8)
if cellfun(@isnan,A(i,j))

Réponse acceptée

Stephen23
Stephen23 le 3 Avr 2019
Modifié(e) : Stephen23 le 3 Avr 2019
Explanation: you forgot to consider what isnan returns with a non-scalar input (such as when you provide it with those character vectors) (hint: it returns a non-scalar logical array of the same size as the input array)
Solution: simply define an anonymous funciton that only return TRUE for numeric scalars (as well as being NaN) (i.e. the output of this function is always scalar):
fun = @(a) isnumeric(a)&&isscalar(a)&&isnan(a);
...
if cellfun(fun,A(i,j))
...
end
  2 commentaires
babyelephant
babyelephant le 3 Avr 2019
Thank you for this help.
Rik
Rik le 3 Avr 2019
Just for the record my suggestion:
function A = fill_nans(A)
% Replaces the NaN in each column with previous non-NaN values.
% If there is no non-NaN value, no change will happen.
fun=@(x) isnumeric(a)&&isscalar(a)&&isnan(a);
for col = 2:size(A,2)
nan_ind=cellfun(fun,A(:,col));
A(nan_ind,col)=A(nan_ind,col-1);
end
end

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Structures dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by