Matlab中mx2矩阵行重排:将含NaN行移至末尾并按指定顺序排列
解决Matlab矩阵按NaN位置重排的问题
我来帮你搞定这个需求!你的场景其实用逻辑索引分类+矩阵拼接就能完美实现,不用纠结复杂的排序逻辑,步骤非常清晰:
核心思路
我们可以把矩阵的行分成三类,然后按「无NaN行 → 第二列含NaN行 → 第一列含NaN行」的顺序拼接起来:
- 第一类:两行都没有NaN的行
- 第二类:第一列正常、第二列是NaN的行
- 第三类:第一列是NaN、第二列正常的行
实现代码
先给你完整的可运行代码,附带测试用例:
% 1. 创建测试矩阵(模拟你的mx2矩阵场景) mat = [1, 2; NaN, 4; 5, NaN; 7, 8; 9, NaN; NaN, 10]; % 2. 定义三个互斥的逻辑索引(对应三类行) no_nan = ~isnan(mat(:,1)) & ~isnan(mat(:,2)); % 无NaN的行 col2_nan = ~isnan(mat(:,1)) & isnan(mat(:,2)); % 第二列含NaN的行 col1_nan = isnan(mat(:,1)) & ~isnan(mat(:,2)); % 第一列含NaN的行 % 3. 按要求顺序拼接矩阵 sorted_mat = [mat(no_nan,:); mat(col2_nan,:); mat(col1_nan,:)]; % 4. 输出结果查看 disp('重排后的矩阵:'); disp(sorted_mat);
代码说明
- 因为你明确说明「部分行的第一列或(而非同时)第二列包含NaN」,所以这三个逻辑索引是完全互斥且覆盖所有行的,不会有遗漏或重复。
- 运行上面的测试代码,输出结果会是:
完全符合「无NaN行在前,然后是第二列NaN行,最后是第一列NaN行」的要求。重排后的矩阵: 1 2 7 8 5 NaN 9 NaN NaN 4 NaN 10
额外补充(可选)
如果你的矩阵存在同时两列都是NaN的行(虽然题目里说没有),可以额外加一个逻辑索引both_nan = isnan(mat(:,1)) & isnan(mat(:,2));,然后把这部分放到最末尾,拼接代码改成:
sorted_mat = [mat(no_nan,:); mat(col2_nan,:); mat(col1_nan,:); mat(both_nan,:)];
内容的提问来源于stack exchange,提问作者Star
相关产品推荐
相关产品推荐

