Removing NaNs from a struct

44 visualizzazioni (ultimi 30 giorni)
Manny Kins
Manny Kins il 1 Mag 2019
I have a struct with the following layout:
T X Y
[0,1] [0, 1] [0,5]
[0] [2] [2]
NaN NaN NaN
NaN NaN NaN
NaN NaN NaN
NaN NaN NaN
[0] [3] [3]
Is there a way to remove all NaN values such that I am left with only:
T X Y
[0,1] [0, 1] [0,5]
[0] [2] [2]
[0] [3] [3]
I am using isnan but keep getting an error "Undefined function 'isnan' for input arguments of type 'struct'".
Thanks
  4 Commenti
Manny Kins
Manny Kins il 1 Mag 2019
Just added, thanks
Walter Roberson
Walter Roberson il 1 Mag 2019
Probably the easiest way is to use struct2cell and cellfun(@(C) any(isnan(C(:)), thecell), and then any() that across the proper dimension, to arrive at a logical vector of location to remove. Then delete those from the original struct.

Accedi per commentare.

Risposta accettata

Stephen23
Stephen23 il 1 Mag 2019
Modificato: Stephen23 il 1 Mag 2019
This works for any sized fields (including empty), and gives you the choice of matching ALL or ANY of the fields containing NaN.
>> F = @(s)all(structfun(@(a)isscalar(a)&&isnan(a),s)); % or ANY
>> X = arrayfun(F,AllData.Passive);
>> AllData.Passive(X) = [];
checking:
>> AllData.Passive.T
ans =
0 1 2 3 4 6 7 8 9 10
ans =
0 3 4 7 9 10
ans =
0 2 6
ans =
0 1 6 7 8
ans =
10
ans =
10
ans =
10
ans =
10
  2 Commenti
Manny Kins
Manny Kins il 2 Mag 2019
Thank you Stephen, this is really useful and flexible. I need to learn more about how and when to use the structfun and arrayfun functions as they seem to be very powerful
Yago Molano Gomez
Yago Molano Gomez il 7 Apr 2020
Hi! I've tried to copy this into my code but changing the empty brackets for a zero, and I get an error that says 'assignment between unlike types is not allowed'.
Also, when I use it with the empty brackets, it does not give me an error but does not remove the NaN's. How can I fix it? I'll attach the structures I'm referring to.

Accedi per commentare.

Più risposte (2)

Jos (10584)
Jos (10584) il 1 Mag 2019
TF = arrayfun(@(k) isnan(AllData.Passive(k).T(1)), 1:numel(AllData.Passive))
AllData.Passive(TF) = []
  1 Commento
Manny Kins
Manny Kins il 2 Mag 2019
Modificato: Manny Kins il 2 Mag 2019
Thank you for your response Jos! Ahh Noddy (Noddy), the little man with the red and yellow car, good memories

Accedi per commentare.


Felipe Ademir aleman hernandez
Modificato: Walter Roberson il 8 Apr 2020
Hey, this works for me:
MyNewDataStruct = structfun( @rmmissing , MyDataStruct , 'UniformOutput' , false)

Categorie

Scopri di più su Structures in Help Center e File Exchange

Tag

Prodotti


Release

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by