【问题标题】:How to get binary output for unique()?如何获得 unique() 的二进制输出?
【发布时间】:2019-05-28 02:45:06
【问题描述】:

[uniq_elements,uniq_indices]=unique(x)

显示独特的元素,例如矢量x

什么是简单(即单行)和高效(即快速执行时间)的方法来简单且仅指示“此值是否唯一”和“如果不是”输出一系列重复项中的第一个?有没有办法使用逻辑运算符来解决这个问题?简单地让一个函数输出“这个值是否唯一”可能是一个开始。

示例代码:

x=[5 5 2 2 3 4 4 1 1 1]; %example values
[~,uniq_indices]=unique(x); %returns [1,3,5,6,8]
result=false(size(x));
result(uniq_indices)=1
%console ouput:
result =

  1×10 logical array

   1   0   1   0   1   1   0   1   0   0

基本上我的假设是——因为只需要逻辑输出——上述代码可以更快/更容易地实现。

【问题讨论】:

  • 您的代码不会标记唯一项目,它也会标记每组重复项中的第一个。我对“独一无二”的理解不同。
  • 为什么你现有的代码不能令人满意?在我的快速测试中它非常快......
  • @Wolfie:可能是这样,我只是想摆脱它,因为我有一种直觉,它可以做得更好——如上所述,这是个人假设,可能是错误的(事实上,它将是我的偏好)
  • 我的目标是这个; unique 在内部使用sort(您可以通过运行edit unique 看到这一点),然后获取相邻元素不相等的所有位置。要获得uniq_indices,排序会被反转,并调用额外的find(以及所有内部检查)。如果你很高兴有一个排序的输入数组,以及对应的唯一值逻辑数组,你可以自己做sortdiff
  • MATLAB 的 unique 创建一个所有元素都是唯一的数组。它检索每组相同元素的一个示例。它并不声称要找到独特的元素。如果您正在寻找其中任何一个选项,我不知道该瞄准什么。我建议你决定你需要哪一个。 :)

标签: matlab


【解决方案1】:

方法 1

这是内存密集型的,因为它创建了一个中间n×n 逻辑矩阵,其中nx 的大小:

result = sum(triu(bsxfun(@eq, x, x.')))==1;

从 R2016b 开始,这可以更简洁地表达为

result = sum(triu(x==x.'))==1;

工作原理

bsxfun(@eq, x, x.')(或x==x.')创建一个相等比较的方阵。

triu 只保留上三角部分,因此每个元素只与之前的元素或自身进行比较。

sum 给出每列的总和。如果总和是1,这意味着该元素不等于任何先前的元素,仅等于它自己。

方法2

这稍微更节省内存。它创建了一个中间m×n 逻辑矩阵,其中m 是唯一元素的数量,n 是元素的总数:

xu = unique(x);
result = any(diff([false(numel(xu),1) bsxfun(@eq, x, xu.')],[],2)==1);

从R2016b开始,第二行可以替换为

result = any(diff([false(numel(xu),1) x==xu.'],[],2)==1);

工作原理

这将创建一个矩阵,例如 A,将 xA 的行索引)的每个唯一元素与 x 的每个元素(A 的列索引)进行比较。让B 表示将false 列附加到A 的结果。

第一次出现在x 中的元素对应B 对应行中的[0 1] 子序列。为了检测到这一点,diff 沿每一行应用,并将结果与​​1(这是[0 1] 中元素之间的增量)进行比较。

【讨论】:

  • 它可能会占用更多内存,但它的运行速度也比我在机器上使用 tic toc 的代码快 1.5-1.75 倍。它是码气!能解释一下使用triu()的逻辑吗?
  • @user2305193 我加了解释,还有另一种方法
  • @CrisLuengo 谢谢!它实际上是不需要的,删除它会提高速度
  • 我测试了第一种方法用于更大的向量,它似乎变得更有效的向量越大
  • @user2305193 只要有足够的内存应该很快。但是对于非常大的向量,内存将是限制因素
猜你喜欢
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 2011-03-17
相关资源
最近更新 更多