我有一个向量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。
任何人都可以考虑更好的事情吗?
答案 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%