# Delete rows in struct based on number of elements in field

6 views (last 30 days)
DavidL88 on 22 Aug 2022
Commented: Rik on 22 Aug 2022
I have a 1x68 struct with 7 fields - Scouts. I want to delete rows where the number of elements under a field 'Vertices' is less than 20. How do I do this? I tried;
Scouts.Vertices(numel(Scouts.Vertices<20)) = []
but got Error using < Too many input arguments.
I would prefer not to run a loop.
Also tried this but comes back as rows = []
[rows,~] = find(numel(Scouts.Vertices)>10);
##### 2 CommentsShow NoneHide None
Stephen23 on 22 Aug 2022
"I have a 1x68 struct with 7 fields - Scouts. I want to delete rows ..."
Your structure only has one row.
DavidL88 on 22 Aug 2022
I mean the columns (1 - 68).

Rik on 22 Aug 2022
If you mean you want to remove elements from your struct, you're fairly close already. Scouts.Vertices returns a comma separated list. You need to feed that to a function that will capture the output.
You could do this:
tmp={Scouts.Vertices};
tmp=cellfun('prodofsize',tmp);
ind = find(tmp>10);
But using a loop would be much simpler.
You could also use structfun, but that would only hide the loop and increase complexity as well.
##### 2 CommentsShow NoneHide None
Stephen23 on 22 Aug 2022
Edited: Stephen23 on 22 Aug 2022
"You could also use structfun, but that would only hide the loop..."
It would not even hide the loop: STRUCTFUN only operates on scalar structures:
S = struct('A',{1,2,3});
structfun(@sqrt,S)
Error using structfun
Inputs to STRUCTFUN must be scalar structures.
Rik on 22 Aug 2022
I may have been thinking of arrayfun. I don't believe I have used either of them recently. I don't think I have ever used arrayfun, other than in proving it's slower than a loop. But thank you for the correction.

### Categories

Find more on Structures in Help Center and File Exchange

### Community Treasure Hunt

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

Start Hunting!