【问题标题】:matrix containing number of occurrence corresponding to each element in the matrix矩阵包含对应于矩阵中每个元素的出现次数
【发布时间】:2013-09-05 15:40:31
【问题描述】:

我有矩阵,假设

A = [1 2 3 1 1 1 2 3]

我想找出数字在矩阵中出现的次数。这个 i/p 的输出矩阵是

B = [1 1 1 2 3 4 2 2]

即1 在数组中出现了 4 次,因此对应于 1 的最后一个值为 4。

uniquesum unique 没有帮助,因为它给出了元素出现的总次数,但我想要另一个矩阵,它每次出现时都会增加计数。

【问题讨论】:

  • 您想要总计还是运行总计?

标签: r matlab matrix


【解决方案1】:

试试这个:

B = ave(A,A,FUN=function(x) 1:length(x))

【讨论】:

  • ave(A, A, FUN=seq_along) 是我通常使用的。
【解决方案2】:

您可以使用以下代码非常简单地做到这一点。这将假设 A 矩阵是一维的,但这并不是一个太大的假设。

A=[1 2 3 1 1 1 2 3];
vals = unique(A);
B = zeros(size(A));
for i = 1:numel(vals)
   idxs = find(diff([0,cumsum(A == vals(i))]));
   B(idxs) = 1:numel(idxs);
end

此解决方案适用于 MATLAB,而不适用于 R。我不知道您想要哪一个。如果您想要 R 答案,我会推荐其他人的答案之一:)

【讨论】:

    【解决方案3】:

    这是 MATLAB 中的一个解决方案:

    B = sum(triu(bsxfun(@eq, A, A.')));
    

    【讨论】:

      【解决方案4】:

      对于 Matlab:

      B = sum(tril(repmat(A,length(A),1)).' + tril(repmat(NaN,length(A),length(A)),-1) == repmat(A,length(A),1))
      

      如果保证A 不包含零,则可以简化为:

      B = sum(tril(repmat(A,length(A),1)).' == repmat(A,length(A),1));
      

      【讨论】:

      • 如果A 包含零,则此方法失败。
      • @MohsenNosratinia 谢谢。已更正!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多