如何遍历向量以获取值的出现次数?

时间:2015-09-15 05:46:15

标签: matlab

我有一个向量v1,其中包含10,000个元素(每个元素的值从0到10),我必须执行一个从0到10的for循环,它通过向量{{1} }。

因此,对于值0,我需要遍历向量v1的10,000个元素,并在每次当前元素等于0时将结果v1增加1.然后我必须重复此所有其他可能的值(1到10)。

例如,v2是一个像v1这样的向量,它有10,000个元素,我必须知道有多少次出现0,1,...... 10。结果必须是类似[2,3,1,4,0,6,5,3,1,...,5]的向量,因此它总计为v2 = [500/10000 , 1300/10000, 1000/10000, 700/10000, ..., 400/10000]

我得到了以下代码,这仍然是错误的,但我希望你得到我所说的。

10000/10000 = 1

3 个答案:

答案 0 :(得分:3)

您所描述的是histogram。在MATLAB中执行此操作的最简单方法是使用内置histcounts函数,并将bin nbins的数量指定为11(0,1,...,10):

[v2,~] = histcounts(v1,11);

到目前为止,v2将包含每个数字的出现次数,即示例中的[500, 1300, ...]。您当然可以将其除以10�除以numel(v1)v1中的元素数量而不是固定数字!),或者您可以使用{{1}直方图函数的属性并将其设置为Normalization。这样,计算了相对的观测数。全部放在一起给你

'probability'

答案 1 :(得分:1)

如果我理解正确,你想要计算向量v1中0到10之间的值。这应该可以解决问题:

% Create example vector
v1 = round(10*rand(1,10000));

v2 = zeros(1,11);
for ii = 0:10
    % Count number of elements in v1 wich have a value of 'ii' and store the result in v2
    v2(ii+1) = numel(find(v1==ii));
end

find(v1==ii)为您提供v1的所有条目,其值iinumel计算。由于Matlab索引始于v2,因此必须使用v2(ii+1) 1进行审核。

更快的版本计算方法是在评论中使用sum(v1==ii)代替numel(find(v1==ii))作为hbaderts

要检查,您是否正确计算了所有值,您可以运行sum(v2),在此示例中应该为您提供10000

答案 2 :(得分:1)

您也可以使用histc。该函数不是创建直方图,但可以用来计算条目数。

entries = histc(a,0:10);

计算条目数0,1,...,10。

然后您可以找到dist = entries./length(a)的分布。如果你想要一个直方图,这与使用边缘扩展的hbaderts的答案相同,除了它没有绘制直方图。如果你想要直方图,我推荐另一个答案。如果没有,这将使你更容易找到一种方法来提取一个似乎凌乱的数据后关闭一个情节。但是,如果要通过使用perecentiles以连续方式生成分布,则hist将使其更容易。但是,您的发布似乎是离散的,因此histc应该可以做到这一点。