extract from structure data with a field with the same value
14 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I have a structure with several fields and I want to extract only the structure elements having the same value for a particular field.
For example:
A = struct('type', '', 'par1', 0, 'par2', 0);
A(1).type = 'type1';
A(1).par1 = 10;
A(1).par2 = 20;
A(2).type = 'type2';
A(2).par1 = 11;
A(2).par2 = 22;
A(3).type = 'type3';
A(3).par1 = 33;
A(3).par2 = 40;
.
.
.
A(10).type = 'type2';
A(10).par1 = -1;
A(10).par2 = -1;
I need to extract ONLY the elements with type = 'type1'; the only way I know to do this is to do a loop like this:
indx = [];
for ii = 1:length(A)
if strcmp(A(ii).type,'type1')
indx = [ind ii];
end
end
Actually, A is bigger than the example; is there an easier an faster way to do this?
Thank you
0 commentaires
Réponse acceptée
Jan
le 22 Jan 2021
Modifié(e) : Jan
le 22 Jan 2021
match = strcmp({A.type}, 'type1'); % Logical indices
idx = find(match) % Indices
value = [A(match).par1] % Faster with logical indexing
5 commentaires
Jan
le 23 Jan 2021
Your apporach has some points for improvements:
idx = find(match1);
Index vectors are more expensive than addressing the elements by logical indexing. So prefer to use match1 directly and omit the find(). The find() for getting match2 is not needed also.
[B.par1] is nices and faster than cell2mat({B.par1}). Together:
match1 = strcmp({A.type}, 'type1');
B = A(match1);
match2 = ([B.par1] == 10);
value = [B(match2).par2];
Creating the partial copy B consumes a lot of ressources. It is cheaper to create the final index without this intermediate copy:
match = strcmp({A.type}, 'type1') & ([A.par1] == 10);
value = [A(match).par2]
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Structures dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!