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 commentaires

Stephen23
Stephen23 le 1 Mai 2019
@Manny Kins: please upload the structure in a .mat file by clicking the paperclip button.
Manny Kins
Manny Kins le 1 Mai 2019
Sure, the actual structure is quite large so I will remove some of the values then upload
Manny Kins
Manny Kins le 1 Mai 2019
Just added, thanks
Walter Roberson
Walter Roberson le 1 Mai 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.

Connectez-vous pour commenter.

 Réponse acceptée

Stephen23
Stephen23 le 1 Mai 2019
Modifié(e) : Stephen23 le 1 Mai 2019

2 votes

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 commentaires

Manny Kins
Manny Kins le 2 Mai 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 le 7 Avr 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.

Connectez-vous pour commenter.

Plus de réponses (2)

Jos (10584)
Jos (10584) le 1 Mai 2019

1 vote

TF = arrayfun(@(k) isnan(AllData.Passive(k).T(1)), 1:numel(AllData.Passive))
AllData.Passive(TF) = []

1 commentaire

Manny Kins
Manny Kins le 2 Mai 2019
Modifié(e) : Manny Kins le 2 Mai 2019
Thank you for your response Jos! Ahh Noddy (Noddy), the little man with the red and yellow car, good memories

Connectez-vous pour commenter.

Felipe Ademir aleman hernandez
Modifié(e) : Walter Roberson le 8 Avr 2020

0 votes

Hey, this works for me:
MyNewDataStruct = structfun( @rmmissing , MyDataStruct , 'UniformOutput' , false)

Catégories

Produits

Version

R2019a

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by