在维度为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
非常大。
答案 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');