如何依据元胞数组B的顺序对结构体数组A进行排序?
解决结构体数组按指定元胞数组顺序排序的问题
嘿,这个需求其实很容易实现,咱们直接用MATLAB内置的ismember函数就能搞定,不用折腾复杂的循环~
先回顾下你的原始数据:
你生成结构体数组A的代码:
number=[1 3 2 4]; name={'dog' 'cat' 'fish' 'monkey'}; age=[7 9 2 13]; A=[]; for i=1:4 A(i).number=number(i); A(i).name=name{i}; A(i).age=age(i); end
指定顺序的元胞数组B:
B={'cat' 'fish' 'monkey' 'dog'}
具体解决方案
只需要三步就能完成排序:
- 先把结构体数组A里的所有
name字段提取成一个独立的元胞数组,方便后续匹配; - 用
ismember函数找到B中每个元素在A的name列表里对应的位置索引; - 用这个索引数组重新排列A,得到顺序和B完全一致的新结构体数组。
完整代码如下:
% 提取A的所有name到元胞数组 A_names = {A.name}; % 找到B中每个元素在A_names中的位置索引 [~, sort_idx] = ismember(B, A_names); % 按索引重新排序A sorted_A = A(sort_idx);
验证结果
你可以输出sorted_A.name看看,结果会和B完全一致:
>> sorted_A.name ans = 1×4 cell array {'cat'} {'fish'} {'monkey'} {'dog'}
原理很简单:ismember(B, A_names)的第二个输出参数sort_idx,就是B中每个元素在A的name列表里的位置编号,用这个编号去索引原结构体数组A,自然就能得到符合B顺序的排序结果啦~
内容的提问来源于stack exchange,提问作者dalleaux




