首页 > 解决方案 > 在Matlab中修改排序以区分不等式和等式

问题描述

A考虑Matlab 中维度为 的矩阵MxN。我希望您能帮助构建一种算法,该算法可以识别A具有严格意义上的从最小到最大的相同元素排序特征的行。但是,我不能使用sort,因为sort不区分平等和不平等。

让我用一个例子更好地解释

clear
A=[1 -2 -4; ...
   0 -3  5;
   1  1  2
   1  2  3
   3  3  4
   10 7  11]; 

请注意:

%A(1,3)<A(1,2)<A(1,1)  
%A(2,2)<A(2,1)<A(2,3)  
%A(3,1)=A(3,2)<A(3,3)  
%A(4,1)<A(4,2)<A(4,3)  
%A(5,2)=A(5,1)<A(5,3)  %equivalent to A(5,1)=A(5,2)<A(5,3)
%A(6,2)<A(6,1)<A(6,3)  

另请注意:第 1 行的排序(严格意义上)与任何其他行的排序不同,第 2 行的排序与第 6 行的排序相同,第 3 行的排序与排序相同在第 5 行中,第 4 行的排序不同于任何其他行的排序。

因此,我想要一个算法提供一个B维度向量,6x1其特征是

%B(2)=B(6) and ~= all other elements of B
%B(3)=B(5) and ~= all other elements of B
%B(1)~= all other elements of B
%B(4)~= all other elements of B

输入的实际数字B可以是完全任意的。例如,我很乐意得到

B=[3;...
  2;...
  1;...
  4;...
  1;...
  2];

让我告诉你为什么sort不起作用

[~,index] = sort(A,2);
[~,~,Bwrong]=unique(index, 'rows');

sort将第 3、4、5 行标识为具有相同的顺序,因为它不区分等式和不等式。

最后让我说我不想使用循环,因为实际上循环A非常大。

标签: matlab

解决方案


您还需要使用 sorted 的第一个差异A来考虑严格的排序。

[s, idx] = sort(A,2);
d = diff(s,[],2) == 0;
[~,~,B] = unique([idx d],'rows');

推荐阅读