对于包含介于1和100之间的40个不同数字的100000个向量,如何计算100000个向量中每个元素的出现次数。
示例:
A = [2 5 6 9]; B = [3 6 9 1]
结果应该是数字介于1和10之间:[1 2 3 4 5 6 7 8 9 10,1 1 1 0 1 2 0 0 2 0]
答案 0 :(得分:2)
您似乎想要计算所有值的直方图
使用hist
命令
n = hist( A(:), 1:100 );
答案 1 :(得分:1)
假设您有一个存储所有这些向量的变量A
(如Shai的假设),hist
的另一个替代方法是使用accumarray
。这应该会自动找出你所拥有的正确数量的垃圾箱,而不像hist
那样指定它们。尝试:
n = accumarray(A(:), 1);
答案 2 :(得分:1)
您还可以使用sparse
功能进行计数:
% 100000x1 vector of integers in the range [1,100]
A = randi([1 100], [100000 1]);
% 100x1 array of counts
n = full(sparse(A, 1, 1, 100, 1));
相同
n = histc(A, 1:100);
或:
n = accumarray(A, 1, [100 1]);
(请注意,我在sparse
和accumarray
调用中明确指定了大小。这是因为如果某个特定向量A
的值不是一直到100,那么计数数组n
的长度将短于100。)
事实上,在accumarray
doc页面的tips section中提到了所有这三种方法,这是三者中最灵活的。
accumarray
的行为类似于histc
函数的行为。 两种功能都将数据分组到箱中。
histc
使用bin边缘将连续值分组为1-D范围。accumarray
使用n维下标对数据进行分组。histc
使用@sum
返回bin计数。accumarray
可以将任何功能应用于垃圾箱。您可以使用
histc
accumarray
来模仿val = 1
的行为。
sparse
函数也具有类似于accumarray
的累积行为。
sparse
使用2-D下标将数据分组到分箱中,而accumarray
使用n维下标将数据分组到分箱中。sparse
将具有相同下标的元素添加到输出中。accumarray
添加具有相同下标的元素 默认情况下输出,但可以选择将任何功能应用于容器。