Этот ответ на один из вопросов, связанных в ОП, является почти правильным для проблемы в ОП. Есть две проблемы:
Первая проблема заключается в том, что в ответе предполагается, что скалярное значение содержится в поле для сортировки, тогда как в 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
, поскольку анонимная функция теперь возвращает скалярное значение.