arrays - 消除元素顺序不同的重复向量

标签 arrays matlab matrix unique

我有一个矩阵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)。

无论如何,我可以强制他以正确的顺序交付行吗?还有更好的方法吗?

最佳答案

您可以按如下方式进行:

  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

关于arrays - 消除元素顺序不同的重复向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37215491/

相关文章:

arrays - Swift2 检查字典中的数组

javascript - 为什么在jQuery中经过for循环后数组顺序是随机的?

matlab - 使 MATLAB 编辑器或命令窗口以编程方式获取焦点

matlab - 拍手声检测

r - 将矩阵转换为R中的栅格

python - 向 MySQL 表添加多个数组

arrays - Presto SQL - 如何获得数组的所有可能组合?

matlab - 如何在幅频响应上使用逆 FFT?

r - 从计算的角度来看,有没有办法简化 $ADA^T$,其中 $D$ 是对角矩阵?

python - 聚类稀疏共现矩阵