Matlab矩阵输出排序问题:如何实现指定规则的矩阵输出?
解决Matlab中按特定规则排序的问题
从你的描述来看,你希望将原本按PB_ID从小到大排列的[PB_ID, time]对,重新排列成先取PB_ID为1、6、11、16,接着取2、7、12、17,以此类推的顺序(也就是按PB_ID除以5的余数分组,余数相同的排在一起,组内按PB_ID递增)。下面提供两种简洁的实现方式:
方法一:基于排序键的通用排序法
这种方法适用于PB_ID数量可能变化的场景,不需要硬编码目标顺序:
% 假设你的原始数据是20×2的矩阵Arrival_A_PB_VS_PB_ID,每行是[PB_ID, time] % 步骤1:生成排序依据的键值对——先按(PB_ID-1)模5的结果分组,再按PB_ID本身排序 sort_keys = [mod(Arrival_A_PB_VS_PB_ID(:,1)-1, 5), Arrival_A_PB_VS_PB_ID(:,1)]; % 步骤2:获取排序后的索引 [~, sort_indices] = sortrows(sort_keys); % 步骤3:按索引排序原始矩阵,并转成一维数组 sorted_matrix = Arrival_A_PB_VS_PB_ID(sort_indices, :); final_result = sorted_matrix(:)';
代码解释:
mod(PB_ID-1,5):把PB_ID分成5组(1/6/11/16→0,2/7/12/17→1,…,5/10/15/20→4),确保同组的PB_ID被归到一起。sortrows:先按第一列(组号)升序,再按第二列(PB_ID)升序,完美匹配你要的排序规则。sorted_matrix(:)':把排序后的20×2矩阵按列展开成一维数组,得到你需要的连续序列。
方法二:硬编码目标顺序的直接提取法
如果你确定PB_ID的范围固定是1-20,可以直接生成目标顺序的索引,快速提取数据:
% 步骤1:定义你想要的PB_ID顺序 target_pb_ids = [1,6,11,16,2,7,12,17,3,8,13,18,4,9,14,19,5,10,15,20]; % 步骤2:找到每个目标PB_ID在原始矩阵中的位置 [~, target_indices] = ismember(target_pb_ids, Arrival_A_PB_VS_PB_ID(:,1)); % 步骤3:提取数据并转成一维数组 final_result = Arrival_A_PB_VS_PB_ID(target_indices, :)'; final_result = final_result(:)';
代码解释:
target_pb_ids:直接写出你需要的PB_ID顺序,直观易懂。ismember:快速定位每个目标PB_ID在原始矩阵中的行索引,确保提取对应的数据对。
验证结果
运行上述任意一种方法后,final_result的输出会是:1 1610 6 1635 11 1660 16 1685 2 1615 7 1640 12 1665 17 1690 3 1620 8 1645 13 1670 18 1695 4 1625 9 1650 14 1675 19 1700 5 1630 10 1655 15 1680 20 1705
完全符合你期望的排序规则。
内容的提问来源于stack exchange,提问作者Maria5G




