首页 > 解决方案 > Matlab数组中唯一元素的累积计数

问题描述

使用 Matlab 2019b。

x = [10 10 10 20 20 30]';

如何获得 中唯一元素的累积计数x,应如下所示:

y = [1 2 3 1 2 1]';

编辑

我的真实数组实际上比上面给出的示例要长得多。以下是我测试的方法:

x = randi([1 100], 100000, 1);
x = sort(x);

% method 1: check neighboring values in one loop
tic
y = ones(size(x));
for ii = 2:length(x)
    if x(ii) == x(ii-1)
        y(ii) = y(ii-1) + 1;
    end
end
toc

% method 2 (Wolfie): count occurrence of unique values explicitly
tic
u = unique(x);
y = zeros(size(x));
for ii = 1:numel(u)
    idx = (x == u(ii));
    y(idx) = 1:nnz(idx);
end
toc

% method 3 (Luis Mendo): triangular matrix
tic
y = sum(triu(x==x'))';
toc

结果:

Method 1: Elapsed time is 0.016847 seconds.
Method 2: Elapsed time is 0.037124 seconds.
Method 3: Elapsed time is 10.350002 seconds.

标签: matlabcountunique

解决方案


假设x已排序:

x = [10 10 10 20 20 30].';
x = sort(x);

[~, ic] = cummax(x);
y = (2 : numel(x) + 1).' - ic;

何时x未排序使用此:

[s, is] = sort(x);
[~, ic] = cummax(s);
y(is) = (2 : numel(s) + 1).' - ic;

推荐阅读