我有一个矩阵A
,它是(243 x 5)。我想选择该矩阵的唯一行向量,但考虑到具有相同元素但顺序不同的行向量应被视为相同。
例如,为简单起见,假设 A
矩阵为 (10 x 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 的唯一行,但它没有提供它找到的第一行。 IE。它不是传递行 (1,2,3,7,9),而是传递行(7, 1, 9, 3, 2)。
无论如何,我可以强制他以正确的顺序交付行吗?还有更好的方法吗?
最佳答案
您可以按如下方式进行:
即:
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
关于arrays - 消除元素顺序不同的重复向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37215491/