Pracuję z systemem pobierania obrazu, używając przecięcia histogramu w MATLAB. Ta metoda daje mi następujące dane: rzeczywistą liczbę reprezentującą odległość przecięcia histogramu i nazwę pliku obrazu. Ponieważ są to różne typy danych, przechowuję je w tablicy struktury z dwoma polami, a następnie zapisuję tę strukturę w pliku .mat. Teraz muszę posortować tę strukturę zgodnie z odległością przecięcia histogramu w porządku malejącym, aby uzyskać obraz o najwyższej odległości przecięcia histogramu. Próbowałem wielu metod sortowania tych danych, ale bez wyniku. Czy możesz pomóc mi rozwiązać ten problem?Jak sortować tablice struktur w programie MATLAB?
Odpowiedz
Oto jeden z przykładów, jak można to zrobić, korzystając z funkcji MAX zamiast sortowania:
%# 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: Jeśli chcieliby Państwo uzyskać N najwyższe wartości, a nie tylko maksymalnie, możesz użyć SORT zamiast MAX (as Shaka suggested). Na przykład (przy użyciu powyższej struktury):
>> 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'
Istnieje również możliwość sortowania całej struktury.
Aby zbudować off przykład gnovice za ...
% 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);
Uwaga: aby posortować według nazwa pliku (lub dowolny ciąg), zrobiłbyś '[~, order] = sort ({s. file});', następnie 'sortedStruct = s (order);'. W takim przypadku nie można użyć '' descend'', dopóki nie zostanie to zaimplementowane w jakiejś przyszłej wersji Matlaba. –
można również użyć ** cat (1, s.value) ** Łączenie wartości – Amro
bardzo dziękuję za odpowiedź, postaram korzystać z tej funkcji. Proszę, czy mogę uzyskać twój adres e-mail, aby przesłać mój mój kodek matlab dzięki –
@zenab: Mój adres e-mail jest w moim profilu. Nie krępuj się napisz do mnie, jeśli masz coś, co chcesz omówić bezpośrednio. – gnovice