在我的代码中,我有一个结构,在它的一个字段中,我想对它的值进行排序。
例如,在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
),而我希望使用正确的形式。
我也见过this和that,但它们对我没有帮助。
如何在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
:
答案 0 :(得分:1)
This answer对OP中链接的问题之一几乎完全是OP中的问题。有两个问题:
第一个问题是答案假定要在要排序的字段中包含标量值,而在OP中,值是char数组(即老式字符串)。
可以通过向'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
,减去最后四个字符'.dcm'
:
[~,I] = sort(arrayfun(@(x)abs(str2double(x.name(1:end-4))),File_Neg));
File_Neg = File_Neg(I);
很有趣,我们不想再使用'UniformOutput',false
,因为匿名函数现在返回标量值。