MATLAB Answers

Filter a struct based on the field name.

230 views (last 30 days)
Ubaldo
Ubaldo on 28 Jul 2016
Answered: Stephen Cobeldick on 28 Jul 2016
Hi all. Assume that i have a struct like the following
my_struct:
f1_x : 0
f1_y : 1
f1_z : 3
f2_x : -1
f2_y : 2
f3_y : 0
My question is how to filter based on the field name (of better, based on part of the field name). For example, if I want to filter all the fields that start with the string f1_, thus obtaning
my_struct_f1:
f1_x : 0
f1_y : 1
f1_z : 3
what should I do? Many thanks in advance.

  0 Comments

Sign in to comment.

Accepted Answer

Adam
Adam on 28 Jul 2016
Edited: Adam on 28 Jul 2016
names = fieldnames( myStruct );
subStr = 'f1_';
filteredStruct = rmfield( myStruct, names( find( cellfun( @isempty, strfind( names , subStr ) ) ) ) );
should work, based on a quick test, though there may be more efficient methods.

  1 Comment

Ammar Dodin
Ammar Dodin on 28 Jul 2016
I also tried what Adam suggested above and it works.

Sign in to comment.

More Answers (2)

Stephen Cobeldick
Stephen Cobeldick on 28 Jul 2016
Rather than using a scalar structure and messy code with fieldnames, a far more efficient and simple approach is to use a non-scalar structure:
S(1).x = 0;
S(1).y = 1;
S(1).z = 3;
S(2).x = -1;
S(2).y = 2;
S(3).y = 0;
and get the first element:
>> S(1)
ans =
x: 0
y: 1
z: 3
See how easy MATLAB can be ?

  0 Comments

Sign in to comment.


Ammar Dodin
Ammar Dodin on 28 Jul 2016
Edited: Ammar Dodin on 28 Jul 2016
For simplicity, let's assume that your struct's name is S. You can first get the field names of struct S using fieldnames. After that you can use something like regex to capture all the filed names that match your criteria.
names = fieldnames(S);
match = {};
for i = 1:length(names)
if ~isempty(regexp(names{i},'^f1')
match{end+1} = names{i};
end

  0 Comments

Sign in to comment.

Products

Community Treasure Hunt

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

Start Hunting!