I have a vector A=[2,5,6,2,4,13,34,3,34]. I want to find a unique value of this vector but not in sorted order! I searched in Matlab site and I found this function
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
Assuming you have a vector (so the 'rows'
version makes no sense), here's a solution based on bsxfun:
[~, ind] = max(bsxfun(@eq, A, A.'));
ind = ind(ind>=1:numel(ind));
C = A(ind);
How it works: Do all pairwise comparisons between elements (bsxfun(@eq, A, A.')
). For each element, find the index of the first equal element ([~, ind]=max(...)
). If that index is smaller than the current position (that is, if there's a previous element which is equal to the current one), disregard it (ind = ind(ind>=...
). Use the surviving indices to generate the result (C = A(ind)
).
Here's an implementation if you are working with 2D arrays and would like to get the same functionality as 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;