查找向量的唯一值,其顺序与matlab中的向量相同

查找向量的唯一值,其顺序与matlab中的向量相同,matlab,vector,unique,Matlab,Vector,Unique,我有一个向量a=[2,5,6,2,4,13,34,3,34]。我想找到这个向量的唯一值,但不是按排序顺序!我在Matlab网站上搜索,找到了这个函数 [C, ia, ic] = unique(A,'rows','stable') 但是这个函数在MatlabR2011A中是无法识别的!可能此功能适用于高于2011的版本!!任何人都知道我如何才能找到与like相同顺序的A的唯一值: A=[2,5,6,4,13,34,3]假设你有一个向量(因此'rows'版本没有意义),下面是一个基于以下内容的解决

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

[C, ia, ic] = unique(A,'rows','stable')
但是这个函数在MatlabR2011A中是无法识别的!可能此功能适用于高于2011的版本!!任何人都知道我如何才能找到与like相同顺序的A的唯一值: A=[2,5,6,4,13,34,3]

假设你有一个向量(因此
'rows'
版本没有意义),下面是一个基于以下内容的解决方案:


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

如果您使用的是二维阵列,并且希望获得与
unique(A,'rows','stable')相同的功能,那么这里有一个实现。
-


那么错误是什么呢?我怀疑你认为你的版本不支持这一点是错误的。
'rows'
不是你想要的向量。为什么你有
rows
?示例
a
只有一列。你在使用2D数组吗?@knedlsepp在旧的Matlab版本中是
unique
的结果已排序,而不是原始格式order@LuisMendo:我确实看过了,只能在2013年和2006年找到更改。2013年的更改与
'stable'
没有任何关系。因此我怀疑2011版应该能够处理
'stable'
。我认为它可以处理2007年我开始使用时的
'stable'
g它,但我可能错了。@knedlsepp r2100b不支持它在所有版本中都不
sort
稳定吗?这会更有效。(使用
sort
和的第二个输出)@knedlsepp
sort
是稳定的,是的。但我不知道这如何取代我使用的
bsxfun
。这可能是可以做到的,但用一种不同的方法。它看起来很有趣;也许你可以自己发布一个答案?THX Luis,这正是我需要与
bsxfun
配合使用的地方!@Divakar哦,我明白了。不,它没有。问题是confusing,因为它的标题是“查找向量的唯一值”,但随后使用了
“行”
好的一行。(尽管我感觉OP可能会回答:它不起作用;;-)因为我怀疑OP首先选择了有效的解决方案,而不是这种美。在另一个故事中:我认为我们可以通过如下方式摆脱
ismember
invOrder(ordered\u ind)=1:length(ordered\u ind);ic=发票人(标签)@knedlsepp该建议有效!非常感谢。是的,就这样吧,因为弗拉德米尔已经这么做了。可能会在那里添加
bsxfun
:)你确实喜欢你的
bsxfun
;-)很好地使用了
索引
,最后!
[~, ind] = max(bsxfun(@eq, A, A.'));
ind = ind(ind>=1:numel(ind));
C = A(ind);
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;
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