【问题标题】:Sort a vector and count the identical occurrences对向量进行排序并计算相同的出现次数
【发布时间】:2012-12-07 22:50:50
【问题描述】:

什么是执行以下操作的 Matlab 高效方式(无循环):将输入向量 input 转换为输出向量 output,例如 output (i) 是输入中小于或等于 input(i) 的整数个数。

例如:

input = [5 3 3 2 4 4 4]

会给:

output = [7 3 3 1 6 6 6]

【问题讨论】:

    标签: matlab sorting unique


    【解决方案1】:

    首先,不要使用input 作为变量名,它是保留关键字。我将在这里改用X

    获得所需结果的另一种方法是:

    [U, V] = meshgrid(1:numel(X), 1:numel(X));
    Y = sum(X(U) >= X(V))
    

    这是一个单行:

    Y = sum(bsxfun(@ge, X, X'))
    

    编辑:
    如果X 有多行并且您想对每一行应用此操作,这有点棘手。您可以执行以下操作:

    [U, V] = meshgrid(1:numel(X), 1:size(X, 2));
    V = V + size(X, 2) * idivide(U - 1, size(X, 2));
    Xt = X';
    Y = reshape(sum(Xt(U) >= Xt(V))', size(Xt))'
    

    例子:

    X =  
       5   3   3   2   4   4   4
       3   9   7   7   1   2   2
    
    Y = 
       7   3   3   1   6   6   6
       4   7   6   6   1   3   3
    

    【讨论】:

    • 谢谢。如果 X 是一个包含多行的矩阵并且您想将操作应用于每一行(没有任何循环)怎么办?例如:X = [5 3 3 2 4 4 4; 5 3 3 2 4 4 4] 两行
    • @AdeB 我已经修改了我的答案,以便可以将此操作应用于具有多行的矩阵。
    【解决方案2】:

    我找到了一个可能的答案:

    output = arrayfun(@(x) sum(x>=input),input)
    

    但它没有利用矢量化。

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 1970-01-01
      • 2019-06-26
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多