2

私はベクトルを持っていますa=[1 2 3 1 4 2 5]'

各行に a の要素の出現回数を与える新しいベクトルを作成しようとしています。たとえば、この行列の場合、結果は[1 1 1 2 1 2 1]'次のようになります。4 番目の要素は 2 です。1 が繰り返されるのはこれが初めてだからです。

それを達成する唯一の方法は、行数が一意の要素の数になるゼロ ベクトルを作成することです (ここでは、c = [0 0 0 0 0]要素が 5 つあるため)。また、a と同じ長さのゼロ ベクトル d も作成します。次に、ベクトル a を調べて、要素を読み取った c の行に 1 を追加し、対応する c の数を d の現在の行に追加します。

誰かがもっと良いことを考えることができますか?

4

5 に答える 5

0

David、chappjc、Luis Mendo によって提案されたソリューションは美しいですが、ベクトルが大きい場合は使用できないことに注意してください。この場合、いくつかの単純なアプローチは次のとおりです。

% Big vector
a = randi(1e4, [1e5, 1]);
a1 = a;
a2 = a;

% Super-naive solution
tic
x = sort(a);
x = x([find(diff(x)); end]);
for hh = 1:size(x, 1)
  inds = (a == x(hh));
  a1(inds) = 1:sum(inds);
end
toc

% Other naive solution
tic
x = sort(a);
y(:, 1) = x([find(diff(x)); end]);
y(:, 2) = histc(x, y(:, 1));
for hh = 1:size(y, 1)
  a2(a == y(hh, 1)) = 1:y(hh, 2);
end
toc

% The two solutions are of course equivalent:
all(a1(:) == a2(:))

実際、問題は次のとおりです。最後のループを回避できるでしょうか。多分arrayfunを使用していますか?

于 2013-10-31T05:51:28.063 に答える