【问题标题】:Find unique values of a vector with same order as in the vector in matlab查找与 matlab 中的向量具有相同顺序的向量的唯一值
【发布时间】:2015-02-22 02:34:40
【问题描述】:

我有一个向量 A=[2,5,6,2,4,13,34,3,34]。我想找到这个向量的唯一值,但不是按排序顺序!我在 Matlab 网站上搜索,发现了这个函数

[C, ia, ic] = unique(A,'rows','stable')

但是这个函数在 Matlab R2011a 中不被识别!可能此功能适用于高于 2011 的版本!任何人都知道如何以与 A 中相同的顺序找到 A 的唯一值,例如: A=[2,5,6,4,13,34,3]

【问题讨论】:

  • 那么错误是什么?我怀疑你假设你的版本不支持这个是错误的。 'rows' 不是你想要的向量。
  • 你为什么有rows?示例 A 只是一列。您在使用二维数组吗?
  • @knedlsepp 在较旧的 Matlab 版本中,unique 的结果是排序的,而不是原始顺序
  • @LuisMendo:我确实看过changelog,只能找到2013年和2006年的变化。2013年的变化与'stable'无关。所以我怀疑2011版本应该可以处理'stable'。我认为它可以处理 'stable' 早在 2007 年我开始使用它时,但我可能错了。
  • @knedlsepp R2010b 不支持

标签: matlab vector unique


【解决方案1】:

如果您正在使用 2D 数组并希望获得与 unique(A,'rows','stable') 相同的功能,这是一个实现 -

function [C, ia, ic] = unique_rows_stable(A)

[unqmat_notinorder,row_ind,labels] = unique(A,'rows','first');

[ia,ordered_ind] = sort(row_ind);

C = unqmat_notinorder(ordered_ind,:);

[~,ic] = ismember(labels,ordered_ind);
%// Or [ic,~] = find(bsxfun(@eq,ordered_ind,labels'))

return;

【讨论】:

  • 好一个。 (虽然我觉得 OP 可能会回答:它不起作用。;-))
  • 我怀疑 OP 选择 works-at-first-try 解决方案而不是这种美感。在另一个故事中:我认为我们可以通过以下方式摆脱ismemberinvOrder(ordered_ind) = 1:length(ordered_ind); ic = invOrder(labels);
  • @knedlsepp 这个建议有效!谢谢!是的,就这样吧,因为弗拉德米尔已经这样做了。可能会在那里添加bsxfun :)
  • 你肯定爱你的bsxfun。 ;-)
【解决方案2】:

假设你有一个 vector(所以'rows' 版本没有意义),这里有一个基于bsxfun 的解决方案:

[~, ind] = max(bsxfun(@eq, A, A.'));
ind = ind(ind>=1:numel(ind));
C = A(ind);

工作原理:在元素之间进行所有成对比较 (bsxfun(@eq, A, A.'))。对于每个元素,找到第一个相等元素的索引 ([~, ind]=max(...))。如果该索引小于当前位置(也就是说,如果前一个元素等于当前位置),则忽略它(ind = ind(ind>=...)。使用幸存的索引生成结果 (C = A(ind))。

【讨论】:

  • sort 不是在所有版本中都稳定吗?这会更有效率。 (使用sort 的第二个输出和...)
  • @knedlsepp @​​987654331@ 是稳定的,是的。但我看不出它如何取代我对bsxfun 的使用。它可能可以完成,但采用不同的方法。看起来很有趣;也许自己发布一个答案?
  • THX Luis,这正是我需要的
  • bsxfun 一起使用很好!
  • @Divakar 哦,我明白了。不,它没有。这个问题令人困惑,因为它的标题是“查找向量的唯一值”,但随后使用了'rows'
【解决方案3】:
A=[2,5,6,2,4,13,34,3,34];
[B, ia] = sort(A);     % B = A(ia)
ib(ia) = 1:length(B);  % A = B(ib)
[C, ic] = unique(B);   % C = B(ic)
D = B(ib(ic));         % unsorted unique values

【讨论】:

  • 最后好好利用indexing
猜你喜欢
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 2022-07-05
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
相关资源
最近更新 更多