【问题标题】:How to find the repeated values in a matrix and which rows they belong to?如何找到矩阵中的重复值以及它们属于哪些行?
【发布时间】:2018-05-19 06:01:48
【问题描述】:

我有一个 m×1 矩阵,A。我想找出哪些元素是重复的并获取它们的行值。 (只是行值,因为矩阵是 m×1。)

我试过了

k = find(~unique(A));

但 k 包含错误的值。

这是我正在尝试做的一个示例。考虑数组 A;

A = [4
     5
     5
     5
     7
     8
     4];

由于 4 和 5 是这里重复的元素,我想获取这些元素的行值并将它们放入一个新数组中。结果数组将是

RowValues= [1
            2
            3
            4
            7];

注意:以上只是一个示例,我正在处理的实际数组在数组A 中包含-0.0038、1.3438 等类型的有理数。

【问题讨论】:

  • 当你尝试unique(A) 时,想想(或阅读文档)~ 会做什么
  • 相关thisthis

标签: matlab matrix duplicates


【解决方案1】:

这是使用intersect的解决方案:

s = sort(A);
c = intersect(s(1:2:end),s(2:2:end));
RowValues = find(ismember(A,c));

我有compared 这个方法和@SardarUsama 提出的方法,在Octave 中有一个大的[1 x 10000000] 输入。结果如下:

=======INTERSECT==========
Elapsed time is 1.94979 seconds.

=======ACCUMARRAY==========
Elapsed time is 2.5205 seconds.

【讨论】:

  • 我花了一些时间来理解 intersect 的输入参数。这很聪明,我必须说。
  • 我已经按原样运行了这段代码,但它跳过了数组中的一些元素。我应该提到这一点,但这段代码是否也适用于正小数和负小数?抱歉,我将编辑我的问题以反映这一点。
  • 其结果与其他答案提供的方法相同。你可以比较一下online
  • @Matte 数组中您认为相同的元素并不真的相同。阅读thisthis 以获得洞察力。
  • @Sardar Usama 是的,我只看到了数字的一部分。我将数字四舍五入,现在我得到了正确的答案,谢谢:)
【解决方案2】:

使用uniqueaccumarrayA的每个元素的计数,过滤掉不重复的值,使用ismember得到重复值的逻辑索引,然后使用find进行转换将它们转换为线性索引。

[C, ~, ic] = unique(A);    
RowValues = find(ismember(A, C(accumarray(ic,1)>1)));

为什么你的代码会得到错误的索引?
在唯一值向量上应用logical NOT 会将它们转换为在唯一值为零的索引处包含true 和在其非零处包含false 的逻辑向量,因此找到非零值(false在这种情况下)这种向量的元素将无处可去。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多