发生号码的向量

时间:2013-10-30 23:15:15

标签: matlab vector

我有一个向量a=[1 2 3 1 4 2 5]'

我正在尝试创建一个新的向量,它将为每一行提供一个元素的出现次数。例如,使用此矩阵,结果将是[1 1 1 2 1 2 1]':第四个元素是2,因为这是第一次重复1。

我能看到实现这一目标的唯一方法是创建一个零向量,其行数将是唯一元素的数量(这里:c = [0 0 0 0 0],因为我有5个元素)。 我还创建了一个与a相同长度的零向量d。然后,遍历向量a,在我们读取的元素的c行中添加一个,并将相应的c的数量添加到当前行的d。

任何人都可以考虑更好的事情吗?

4 个答案:

答案 0 :(得分:9)

这是一种很好的方式

C=sum(triu(bsxfun(@eq,a,a.')))

我的第一个建议就是这个,一个不太好的for循环

for i=1:length(a)
    F(i)=sum(a(1:i)==a(i));
end

答案 1 :(得分:4)

这可以做你想要的,没有循环:

m = max(a);
aux = cumsum([ ones(1,m); bsxfun(@eq, a(:), 1:m) ]);
aux = (aux-1).*diff([ ones(1,m); aux ]);
result = sum(aux(2:end,:).');

答案 2 :(得分:4)

我的第一个念头:

M = cumsum(bsxfun(@eq,a,1:numel(a)));
v = M(sub2ind(size(M),1:numel(a),a'))

答案 3 :(得分:4)

在完全不同的级别上,您可以查看tabulate以获取有关值的频率的信息。例如:

tabulate([1 2 4 4 3 4])

  Value  Count  Percent
  1      1      16.67%
  2      1      16.67%
  3      1      16.67%
  4      3      50.00%