Matlab中的排序

Matlab中的排序,matlab,list,sorting,Matlab,List,Sorting,我想在逗号分隔的列表中对元素进行排序。列表中的元素是结构,我希望列表按照结构中的一个字段进行排序 例如,给定以下代码: L = {struct('obs', [1 2 3 4], 'n', 4), struct('obs', [6 7 5 3], 'n', 2)}; 我想有一种方法来按字段“n”对L进行排序。Matlab的排序函数仅适用于矩阵或数组以及字符串列表(甚至不适用于数字列表) 对如何实现这一目标有何想法 谢谢 Micha我建议您分三步执行此操作:将“n”提取到数组中,对数组进行排序

我想在逗号分隔的列表中对元素进行排序。列表中的元素是结构,我希望列表按照结构中的一个字段进行排序

例如,给定以下代码:

 L = {struct('obs', [1 2 3 4], 'n', 4), struct('obs', [6 7 5 3], 'n', 2)};
我想有一种方法来按字段“n”对L进行排序。Matlab的排序函数仅适用于矩阵或数组以及字符串列表(甚至不适用于数字列表)

对如何实现这一目标有何想法

谢谢


Micha

我建议您分三步执行此操作:将“n”提取到数组中,对数组进行排序,然后对单元格数组的元素重新排序

%# get the n's
nList = cellfun(@(x)x.n,L);

%# sort the n's and capture the reordering in sortIdx
[sortedN,sortIdx] = sort(nList);

%# use the sortIdx to sort L
sortedL = L(sortIdx)

值得一提的是,以下是Python中的解决方案:

L = [{'n': 4, 'obs': [1, 2, 3, 4]}, {'n': 2, 'obs': [6, 7, 5, 3]}]
L.sort(lambda a,b: a['n'].__cmp__(b['n']))
# L is now sorted as you wanted

这有点旁敲侧击,但如果单元数组
L
中的所有结构都有相同的字段(
obs
n
),那么将
L
存储为1×n结构数组而不是1×1结构的1×n单元数组会更有意义

要将结构的1×N单元数组转换为1×N结构数组,可以执行以下操作:

L = [L{:}];
或者,您可以使用一次对的调用直接创建结构数组,而不是像在示例中那样创建结构的单元数组:

L = struct('obs',{[1 2 3 4],[6 7 5 3]},'n',{4,2});
现在问题变得更简单了:

[junk,sortIndex] = sort([L.n]);  %# Collect field n into an array and sort it
sortedL = L(sortIndex);          %# Apply the sort to L

如果您使用的是最新版本的MATALB,则可以执行
[~,sortIdx]=sort(nList)。这样你就不会有额外的变量了。@JudoWill:这是一个很棒的新功能,但我不久前才发现它不向后兼容。我的一些同事有较旧版本的MATLAB,当他们试图运行它时,我的代码突然停止了。@JudoWill:我喜欢这个功能,我可能会在2-3年后开始使用它。@Jonas离你可以使用它只有一个月了。:)@Cygal:我已经开始使用它了,但就在一个月前,我不得不仔细检查大量代码以去除所有的波浪形符号,因为我与运行2008b的人一起工作。作为旁注,排序并不是那么不言而喻的。你可能会想要自然的那种