請注意,由大衛,chappjc和路易斯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?
這確實是for循環,但這比我做的更好,更簡單! – teaLeef
我添加了一個可能更有效的不同方法。 – David
+1使用'triu'。非常聰明!如果你跳過B,你甚至可以把它變成一行代碼。 – nispio