2016-05-13 74 views
3

我有一个矩阵A,它是(243 x 5)。我想挑选矩阵的唯一行向量,但考虑到具有相同元素但排序不同的行向量应该被认为是相同的。消除重复的向量,但元素的顺序不同

例如,假设为简单起见,该A矩阵是(10×5),并且等于:

A=[1 2 1 2 3 
    1 3 1 1 1 
    1 3 1 1 2 
    1 2 1 1 3 
    2 3 1 2 1 
    1 3 1 2 2 
    1 3 1 2 3 
    1 3 1 3 2 
    1 3 1 3 1 
    1 3 2 3 1] 

在上面的例子中,行(1,5,6)将被认为是等价它们具有相同的元素,但顺序不同。另外,行(3和4)是等效的,行(7,8,10)也是等价的。

是否有任何方法可以编写一个代码来删除所有“重复行”,即仅传递A行(1,2,3,7和9)的代码?

到目前为止我碰到这种解决方案:

B(:,1) = sum(A == 1,2); 
B(:,2) = sum(A == 2,2); 
B(:,3) = sum(A == 3,2); 
[C, ia, ic] = unique(B,'rows'); 
Result = A(ia,:); 

这也提供了我所期待的一个警告 - 它提供的唯一行根据上述定义的标准A,但它不是交付它找到的第一行。即而不是交付行(1,2,3,7,9)它交付行(7,1,9,3,2)。

无论如何,我可以强迫他以正确的顺序传递行?还有更好的方法呢?

回答

1

如下你可以这样做:

  1. Sort沿第二维度A;
  2. 获取稳定指数unique(排序)行;
  3. 将结果作为行索引使用到原始A中。

即:

As = sort(A, 2); 
[~, ind] = unique(As, 'rows', 'stable'); 
result = A(ind,:); 

对于

A = [1 2 1 2 3 
    1 3 1 1 1 
    1 3 1 1 2 
    1 2 1 1 3 
    2 3 1 2 1 
    1 3 1 2 2 
    1 3 1 2 3 
    1 3 1 3 2 
    1 3 1 3 1 
    1 3 2 3 1]; 

这给

result = 
    1  2  1  2  3 
    1  3  1  1  1 
    1  3  1  1  2 
    1  3  1  2  3 
    1  3  1  3  1