2009-09-30 31 views
10

Estoy trabajando con un sistema de recuperación de imágenes usando la intersección del histograma de color en MATLAB. Este método me proporciona los siguientes datos: un número real que representa la distancia de intersección del histograma y el nombre del archivo de imagen. Debido a que son tipos de datos diferentes, los almaceno en una matriz de estructura con dos campos, y luego guardo esta estructura en un archivo .mat. Ahora necesito ordenar esta estructura de acuerdo con la distancia de intersección del histograma en orden descendente para recuperar la imagen con la distancia de intersección del histograma más alta. He intentado muchos métodos para ordenar estos datos pero sin resultado. ¿Puedes ayudarme a resolver este problema?¿Cómo ordenar matrices de estructuras en MATLAB?

Respuesta

12

Aquí hay un ejemplo de cómo se puede hacer esto, utilizando la función MAX en lugar de tener que ordenar:

%# 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 desea obtener los valores más altos de N, y no sólo el máximo, puede usar SORT en lugar de MAX (as Shaka suggested). Por ejemplo (usando la estructura anterior):

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

también se puede utilizar ** cat (1, s.value) ** para concatenar los valores – Amro

+0

muchas gracias por la respuesta, voy a tratar para usar esta función Por favor, puedo obtener su dirección de correo electrónico para enviarle mi bacalao matlab gracias –

+0

@zenab: Mi dirección de correo electrónico está en mi perfil. Siéntete libre de escribirme una línea si tienes algo que quieras discutir directamente. – gnovice

15

También es posible ordenar toda la estructura.

Para construir fuera del ejemplo 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

Nota: para ordenar por el nombre de archivo (o cualquier cadena), harías '[~, orden] = sort ({s.file});', luego 'sortedStruct = s (orden);'. No puede usar ''descender'' en ese caso, hasta que esto se implemente en alguna versión futura de Matlab. –

Cuestiones relacionadas