You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动