Как отсортировать значения поля в структуре в Matlab? - PullRequest
0 голосов
/ 10 января 2019

В моем коде есть структура, и в поле я хочу отсортировать ее значения. Например, в поле File_Neg.name имеются следующие значения, и они должны быть отсортированы как правильные значения.

File_Neg.name        --> Sorted File_Neg.name
'-10.000000.dcm'         '-10.000000.dcm'
'-102.500000.dcm'        '-12.500000.dcm'
'-100.000000.dcm'        '-100.000000.dcm' 
'-107.500000.dcm'        '-102.500000.dcm'  
'-112.500000.dcm'        '-107.500000.dcm'
'-110.000000.dcm         '-110.000000.dcm' 
'-12.500000.dcm'         '-112.500000.dcm'    

Существует папка, в которой есть несколько изображений с отрицательными метками (на приведенном выше примере есть метки изображений). Я хочу получить их в том же порядке, что и в папке (это означает Sorted File_Neg.name). Но при запуске следующего кода значения Files_Neg.name загружаются как приведенный выше пример (слева: File_Neg.name), а мне нужна правильная форма. Я также видел , и , , но они мне не помогли.
Как отсортировать значения поля в структуре в Matlab?

Files_Neg = dir('D:\Rename-RealN'); 
File_Neg = dir(strcat('D:\Rename-RealN\', Files_Neg.name, '\', '*.dcm'));  
% when running the code the values of Files_Neg.name load as the above example (left: File_Neg.name)

File_Neg.name

enter image description here

1 Ответ

0 голосов
/ 10 января 2019

Этот ответ на один из вопросов, связанных в ОП, является почти правильным для проблемы в ОП. Есть две проблемы:

Первая проблема заключается в том, что в ответе предполагается, что скалярное значение содержится в поле для сортировки, тогда как в OP значениями являются массивы символов (то есть строки старомодного типа).

Эту проблему можно исправить, добавив 'UniformOutput',false к вызову arrayfun:

File_Neg = struct('name',{'-10.000000.dcm','-102.500000.dcm','-100.000000.dcm','-107.500000.dcm','-112.500000.dcm','-110.000000.dcm','-12.500000.dcm'},...
                  'folder',{'a','b','c','d','e1','e2','e3'});

[~,I] = sort(arrayfun(@(x)x.name,File_Neg,'UniformOutput',false));
File_Neg = File_Neg(I);

File_Neg теперь сортируется в соответствии с сортировкой по словарю (используя порядок букв ASCII, что означает, что заглавные буквы идут первыми, а 110 по-прежнему перед 12).

Вторая проблема заключается в том, что OP хочет сортировать по величине числа в имени файла, не используя словарную сортировку. Это можно исправить, извлекая значение в анонимной функции, примененной с помощью arrayfun. Мы используем str2double в имени файла, минус последние 4 символа '.dcm':

[~,I] = sort(arrayfun(@(x)abs(str2double(x.name(1:end-4))),File_Neg));
File_Neg = File_Neg(I);

Как ни странно, мы больше не хотим использовать 'UniformOutput',false, поскольку анонимная функция теперь возвращает скалярное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...