# How can I get a 'random index' of unique elements in a matrix rather than first/last index ?

1 ビュー (過去 30 日間)
Varun Pai 2018 年 11 月 21 日
コメント済み: Andrei Bobrov 2018 年 11 月 21 日
For eg , I have a matrix
M = [2;2;2;2;2;1;1;1;1;3;5;5;5;5;6;6;4;4;4]
So when I apply,
[C, ia, ~] = unique(M)
I will get
C = [1;2;3;4;5;6]
ia = [6;1;10;17;11;15];
Always first index of each unique element is returned by default. If 'last' is given as argument, the last index will be returned.
Instead I would like to get random index,
For eg ,
ia = [8;3;10;19;12;16]
I tried below code snippet which works. Each time random index of unique values are returned, but as the matrix size increases the process gets slower.
M = [2;2;2;2;2;1;1;1;1;3;5;5;5;5;6;6;4;4;4]
iq = unique(M);
randIx = zeros(numel(iq,1));
idxMatrix = 1:numel(M);
for i = 1:numel(iq)
labelIdx = idxMatrix(M==iq(i));
randomLabel = randi(numel(labelIdx));
randIdx(i) =labelIdx(randomLabel);
end
randIdx
Is there a better way than this which is faster ? Please comment if you need any clarification about the question.

サインインしてコメントする。

### 採用された回答

Bruno Luong 2018 年 11 月 21 日
p = randperm(length(M));
[C,ia,~] = unique(M(p));
ia = p(ia)
##### 2 件のコメント表示非表示 1 件の古いコメント
Andrei Bobrov 2018 年 11 月 21 日
+1!

サインインしてコメントする。

### その他の回答 (2 件)

Arunkumar M 2018 年 11 月 21 日
M = [2;2;2;2;2;1;1;1;1;3;5;5;5;5;6;6;4;4;4];
[C, ia, ~] = unique(M);
randIdx = [];
for i = 1:length(C)
randIdx = [randIdx; randi([min(find(M == C(i))) max(find(M == C(i)))],1,1)];
end
##### 1 件のコメント表示非表示 なし
Varun Pai 2018 年 11 月 21 日
Thank you for your time. But this would give wrong result if M is slightly changed to
M = [2;2;2;2;2;1;1;1;1;3;5;2;5;5;6;6;4;1;4];

サインインしてコメントする。

Andrei Bobrov 2018 年 11 月 21 日

M = [2;2;2;2;2;1;1;1;1;3;5;5;5;5;6;6;4;4;4];
[~,b,c] = unique(M);
out = round(rand(numel(b),1).*(accumarray(c,1) - 1)) + b;
M = [2;2;2;2;2;1;1;1;1;3;5;2;5;5;6;6;4;1;4];
[a,b,c] = unique(M,'stable');
[~,jj] = sort(a);
[z,ii] = sort(c);
out = ii(round(rand(numel(a),1).*(accumarray(z,1) - 1))+find([true;diff(z)==1]));
out = out(jj);
##### 2 件のコメント表示非表示 1 件の古いコメント
Andrei Bobrov 2018 年 11 月 21 日