2009-09-30 11 views
10

Je travaille avec un système de recherche d'images utilisant l'intersection d'histogrammes couleur dans MATLAB. Cette méthode me donne les données suivantes: un nombre réel qui représente la distance d'intersection de l'histogramme et le nom du fichier image. Comme ce sont des types de données différents, je les stocke dans un tableau de structure avec deux champs, puis j'enregistre cette structure dans un fichier .mat. Maintenant, j'ai besoin de trier cette structure en fonction de la distance d'intersection de l'histogramme dans l'ordre décroissant afin de récupérer l'image avec la plus grande distance d'intersection de l'histogramme. J'ai essayé plusieurs méthodes pour trier ces données mais sans résultat. S'il vous plaît pouvez-vous m'aider à résoudre ce problème?Comment trier les tableaux de structure dans MATLAB?

Répondre

12

est Voici un exemple de la façon dont vous pouvez faire cela, en utilisant la fonction MAX au lieu d'avoir à trier:

%# First, create a sample structure array: 

s = struct('value',{1 7 4},'file',{'img1.jpg' 'img2.jpg' 'img3.jpg'}); 

%# Next concatenate the "value" fields and find the index of the maximum value: 

[maxValue,index] = max([s.value]); 

%# Finally, get the file corresponding to the maximum value: 

maxFile = s(index).file; 

EDIT: Si vous souhaitez obtenir les N valeurs les plus élevées, et pas seulement maximum, vous pouvez utiliser SORT au lieu de MAX (as Shaka suggested). Par exemple (en utilisant la structure ci-dessus):

>> N = 2; %# Get two highest values 
>> [values,index] = sort([s.value],'descend'); %# Sort all values, largest first 
>> topNFiles = {s(index(1:N)).file} %# Get N files with the largest values 

topNFiles = 

    'img2.jpg' 'img3.jpg' 
+1

vous pouvez également utiliser ** chat (1, s.value) ** pour concaténer les valeurs – Amro

+0

Merci beaucoup pour la réponse, je vais essayer pour utiliser cette fonction. S'il vous plaît, puis-je obtenir votre adresse e-mail afin de vous envoyer mon matlab mor merci –

+0

@zenab: Mon adresse e-mail est sur mon profil. Ne hésitez pas à me laisser tomber une ligne si vous avez quelque chose que vous voulez discuter directement. – gnovice

15

Il est également possible de trier la structure entière.

Pour construire au large de l'exemple de gnovice ...

% Create a structure array 
s = struct('value',{1 7 4},'file',{'img1.jpg' 'img2.jpg' 'img3.jpg'}); 

% Sort the structure according to values in descending order 
% We are only interested in the second output from the sort command 

[blah, order] = sort([s(:).value],'descend'); 

% Save the sorted output 

sortedStruct = s(order); 
+0

Note: pour trier par le nom de fichier (ou toute autre chaîne), vous devez faire '[~, order] = sort ({s.file});', puis 'sortedStruct = s (order);'. Dans ce cas, vous ne pouvez pas utiliser "descending", jusqu'à ce que cela soit implémenté dans une future version de Matlab. –

Questions connexes