【问题标题】:Cumulative count of unique element in Matlab arrayMatlab数组中唯一元素的累积计数
【发布时间】:2020-09-23 16:57:18
【问题描述】:

使用 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.

【问题讨论】:

标签: matlab count unique


【解决方案1】:

您可以遍历唯一元素,并将它们的索引设置为 1:n 每次...

u = unique(x);
y = zeros(size(x));
for ii = 1:numel(u)
    idx = (x == u(ii));
    y(idx) = 1:nnz(idx);
end

【讨论】:

    【解决方案2】:

    这有点低效,因为它会生成一个中间矩阵,而实际上只需要一个三角形的一半:

    y = sum(triu(x==x.')).';
    

    【讨论】:

    • 这很简洁,但正如你所说的效率低下。事实证明这不仅仅是一点点:) 我真正的数组要长得多。查看我的编辑。
    • 我明白了。如果您从一开始就包含该信息会有所帮助:-)
    • 无论如何,只要所需的矩阵适合可用内存,在我的比较中,矩阵方法在您在计时中使用的其他两种方法之间的票价。我正在使用 R2017b
    【解决方案3】:

    假设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;
    

    【讨论】:

      猜你喜欢
      • 2014-01-03
      • 2013-03-19
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 2019-07-15
      • 1970-01-01
      相关资源
      最近更新 更多