Removing NaNs from a struct

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 个评论

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

请先登录,再进行评论。

 采纳的回答

Stephen23
Stephen23 2019-5-1
编辑:Stephen23 2019-5-1
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 个评论

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

请先登录,再进行评论。

更多回答(2 个)

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

1 个评论

Thank you for your response Jos! Ahh Noddy (Noddy), the little man with the red and yellow car, good memories

请先登录,再进行评论。

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

类别

帮助中心File Exchange 中查找有关 Cell Arrays 的更多信息

产品

版本

R2019a

标签

Community Treasure Hunt

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

Start Hunting!

Translated by