计算数组中的重复整数

obc*_*don 8 sorting matlab vector counting sequence

如果我有这个向量:

x = [1 1 1 1 1 2 2 2 3 4 4 6 6 6 6]
Run Code Online (Sandbox Code Playgroud)

我想根据自己得到每个唯一号码的位置.

y = [1 2 3 4 5 1 2 3 1 1 2 1 2 3 4]
Run Code Online (Sandbox Code Playgroud)

目前我正在使用:

y = sum(triu(x==x.')) % MATLAB 2016b and above
Run Code Online (Sandbox Code Playgroud)

它很紧凑,但显然没有内存效率.

对于MATLAB编程的纯粹美,我会避免使用循环.你有更好的简单实现吗?

语境:

我的最终目标是对矢量进行排序,x但约束条件是出现N次数的数字优先于另一个出现N次数的数字:

[~,ind] = sort(y);
x_relative_sort = x(ind);
% x_relative_sort = 1   2   3   4   6   1   2   4   6   1   2   6   1   6   1
Run Code Online (Sandbox Code Playgroud)

gno*_*ice 6

假设x是,这里整理是一个量化的替代使用unique,diff以及cumsum:

[~, index] = unique(x);
y = ones(size(x));
y(index(2:end)) = y(index(2:end))-diff(index).';
y = cumsum(y);
Run Code Online (Sandbox Code Playgroud)

现在您可以应用最终排序:

>> [~, ind] = sort(y);
>> x_relative_sort = x(ind)

x_relative_sort =

     1     2     3     4     6     1     2     4     6     1     2     6     1     6     1
Run Code Online (Sandbox Code Playgroud)


rah*_*ma1 5

如果你有正整数,你可以使用稀疏矩阵:

[y ,~] = find(sort(sparse(1:numel(x), x, true), 1, 'descend'));
Run Code Online (Sandbox Code Playgroud)

同样x_relative_sort可以直接计算:

[x_relative_sort ,~] = find(sort(sparse(x ,1:numel(x),true), 2, 'descend'));
Run Code Online (Sandbox Code Playgroud)