在Matlab中修改排序以区分不平等和平等

时间:2018-08-02 13:53:56

标签: 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行的排序与其他任何行的排序不同。

因此,我想要一种算法来传递特征为{p>的维度为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非常大。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您要基于沿每一行的后续元素之间的一组(不等式)关系对行进行排序。可以按以下方式获得此集合:

s = sign(diff(A,[],2));

矩阵s包含-1表示>,0表示==和1表示<。 OP提出的unique调用将在矩阵s上起作用:

[~,~,B] = unique(s,'rows');

此答案与rahnema1's answer非常相似,但我认为它稍微更简单易懂。该解决方案仅使用diff来查找相等性,而将其他排序关系留给sort的结果。在这里,我们使用sign将任何正差转换为+1,并将任何负差转换为-1。因此,我们可以跳过排序。

有可能将其制成一个衬纸:

[~,~,B] = unique(sign(diff(A,[],2)),'rows');