ベクトル内の前の位置に出現した最初の要素を見つけたいです。
たとえば、ベクトルが次の場合:
v = [1, 3, 2, 3, 4, 5];
v(4) = 3
3 は 2 回見られた最初の要素であるため、答えはです。
この操作をベクトル化する方法はありますか?
更新:
これが私の現在の解決策です。より良い提案はありますか?
[s o] = sort(v); % sort the array
d = diff(s); % the first zero corresponds to the first repetitive element
d = find(d == 0);
o(d(1) + 1)
2 回検出された最初の要素のインデックスです。
新しい更新:
@mwengler のソリューションに続いて、MATRIX の各行の最初の繰り返し要素を見つけるソリューションを考え出しました。
function vdup = firstDup(M)
[SM Ord] = sort(M, 2); % sort by row
[rows cols] = find(~diff(SM, 1, 2)); % diff each row, and find indices of the repeated elements in sorted rows
Mask = (size(M,2) + 1) * ones(size(M)); % create a Mask matrix with all size(M,2)+1
ind = sub2ind(size(Ord), rows, cols+1); % add 1 to the column indices
Mask(ind) = Ord(ind); % get the original indices of each repeated elements in each row
vdup = min(Mask, [], 2); % get the minimum indices of each row, which is the indices of first repeated element