2009-09-30 15 views
10

Sto lavorando con un sistema di recupero di immagini usando l'intersezione dell'istogramma di colore in MATLAB. Questo metodo mi fornisce i seguenti dati: un numero reale che rappresenta la distanza di intersezione dell'istogramma e il nome del file di immagine. Poiché sono tipi di dati diversi, li memorizzo nell'array della struttura con due campi, quindi salvi questa struttura in un file .mat. Ora ho bisogno di ordinare questa struttura secondo la distanza di intersezione dell'istogramma in ordine discendente al fine di recuperare l'immagine con la più alta distanza di intersezione dell'istogramma. Ho provato molti metodi per ordinare questi dati ma senza risultato. Per favore puoi aiutarmi a risolvere questo problema?Come ordinare gli array di strutture in MATLAB?

risposta

12

Ecco un esempio di come si possa fare ciò, utilizzando la funzione MAX invece di dover ordinare:

%# 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: Se si desidera ottenere i più alti valori N, e non solo la massimo, è possibile utilizzare SORT anziché MAX (as Shaka suggested). Ad esempio (utilizzando la struttura sopra):

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

è anche possibile utilizzare ** cat (1, s.value) ** per concatenare i valori – Amro

+0

Grazie mille per la risposta, cercherò usare questa funzione. Per favore posso avere il tuo indirizzo e-mail per inviarti il ​​mio matlab cod grazie –

+0

@zenab: Il mio indirizzo email è sul mio profilo. Sentiti libero di scrivermi se hai qualcosa di cui vuoi discutere direttamente. – gnovice

15

È anche possibile ordinare l'intera struttura.

Per costruire al largo di esempio di 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

Nota: per ordinare il nome del file (o qualsiasi stringa), si farebbe '[~, order] = sort ({s.file});', quindi 'sortedStruct = s (ordine);'. Non è possibile usare "descend" in questo caso, fino a quando non verrà implementato in alcune versioni future di Matlab. –

Problemi correlati