2

ベクトル内の前の位置に出現した最初の要素を見つけたいです。

たとえば、ベクトルが次の場合:

v = [1, 3, 2, 3, 4, 5];

v(4) = 33 は 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
4

4 に答える 4

3

これは機能します。@Steveは、更新されたソリューションのエラーを指摘しました。

[~, ~, Iv] = unique(v, 'stable');
idx = find(diff(Iv)-1, 1)+1;
el = v(idx);

この後、elに最初に繰り返される要素が含まれ、のインデックスになりvます。idxv

まず、stable uniqueを使用して、一意の要素を見つけます。2番目の出力引数には、各一意の要素の元のインデックスが含まれています。次に、実行diff(Iv) - 1して元のインデックスのジャンプを見つけます。最初の要素を取得するために使用find(, 1)し、元のベクトルのインデックスを取得するために1つ追加します。元のベクトルにインデックスを付けて、必要な要素を取得します。

于 2012-06-15T20:54:29.597 に答える
1

@Fashが最初に提案した答えALMOSTは機能します。彼の道をさらに進んでいく:

sv = sort(v);
repeated = sv(~diff(sv));
ifr = find(ismember(v,repeated),'first');
ir2 = find(v==v(ifr));
index_desired = ir2(2);
value_desired = v(index_desired);
于 2012-06-15T22:32:33.110 に答える
-1

すでにコンテンツがあることを確認できるハッシュテーブルに保存しますか?

何かのようなもの:

If (hash.hasValue(i))
  return true;
else
  hash.insert(i, 1);
  return false;

ここで、i はキー、位置であり、単純なものだけを含めることができます。たとえば、小さな構造サイズを可能にするために少しだけ含めることができます。

于 2012-06-15T19:53:46.290 に答える