如何计算矩阵中给定值的元素数量?


73

有谁知道如何计算一个值出现在矩阵中的次数?

例如,如果我有一个1500 x 1矩阵M(向量),该矩阵存储工作日(1-7)的值,那么我该如何计算多少个星期日(1),星期一(2),...,星期六(7)被存储在M

Answers:


98

看一下确定并计算数组的唯一值

或者,要计算的出现次数5,只需执行

sum(your_matrix == 5)

1
简单好答案。并与更多的扩展代码工作不是单行矩阵,只需使用:SUM(SUM(your_matrix == 5))
亚历克斯B.

8
@AlexB。适用于任意尺寸矩阵的适当扩展是sum(your_matrix(:) == 5)
Dennis Jaheruddin 2014年

也可以用于计数多个值的出现,可以sum(your_matrix == [ 1, 2, 3 ])
马丁·贾库比克(Martin jakubik)

73

这是我计算唯一元素时可以想到的所有方法的列表:

M = randi([1 7], [1500 1]);

选项1:制表

t = tabulate(M);
counts1 = t(t(:,2)~=0, 2);

选项2:hist / histc

counts2_1 = hist( M, numel(unique(M)) );
counts2_2 = histc( M, unique(M) );

选项3:AccumArray

counts3 = accumarray(M, ones(size(M)), [], @sum);
%# or simply: accumarray(M, 1);

选项4:排序/比较

[MM idx] = unique( sort(M) );
counts4 = diff([0;idx]);

选项5:arrayfun

counts5 = arrayfun( @(x)sum(M==x), unique(M) );

选项6:bsxfun

counts6 = sum( bsxfun(@eq, M, unique(M)') )';

选项7:稀疏

counts7 = full(sparse(M,1,1));

4
我很喜欢这个答案,而不是链接到mathworks的答案,因为它非常清楚且自成体系。
gakera 2014年

@Amro使用M = [1 2 100000],选项2,counts2_1 = hist( M, numel(unique(M)) )给出[2 0 1]哪个不够好,是吗?应该是公正的counts2_1 = hist( M, unique(M) )
Evgeni Sergeev

@EvgeniSergeev:你是对的。HIST的第二个参数可以具有不同的含义:1)它可以是表示bin数量的标量hist(data,nbins)(在这种情况下,范围[min(data),max(data)]划分为相等大小的N-bins)2)它也可以将bin中心指定为hist(data,xvalues),假设xvalues为3)或在矢量xvalues不是均匀分布的情况下,则将连续值之间的中点用作bin边。
Amro 2014年

@EvgeniSergeev:在所有三种情况下,hist内部代码最终都会调用该histc函数(请检查源代码edit hist.m,而这histc是一个内置函数)。因此,我认为最好避免hist在这里直接histc使用显式的bin边缘进行调用,如我上面所示。
Amro 2014年

1
我上面给出的示例主要用于OP所示的数据,并且其中一些方法假定数据值为整数,并且最好以开头1。请参阅有关如何处理一般较多的情况下如下回答:stackoverflow.com/a/4093228/97160stackoverflow.com/a/6933863/97160
荷银

10

您可以一次对所有值1到7执行此操作的一种方法是使用功能ACCUMARRAY

>> M = randi(7,1500,1);  %# Some random sample data with the values 1 through 7
>> dayCounts = accumarray(M,1)  %# Will return a 7-by-1 vector

dayCounts =

   218       %# Number of Sundays
   200       %# Number of Mondays
   213       %# Number of Tuesdays
   220       %# Number of Wednesdays
   234       %# Number of Thursdays
   219       %# Number of Fridays
   196       %# Number of Saturdays

5

假设w包含星期数([1:7])

n = histc(M,w)

如果您不知道M中的数字范围:

n = histc(M,unique(M))

如通过命令进行SQL Group!


4

这将是完美的原因,因为我们正在对矩阵进行运算,并且答案应该是一个数字

sum(sum(matrix==value))

3

这是Matlab Central File Exchange上可用的非常好的功能文件。

countmember.m链接

此功能文件已完全矢量化,因此非常快捷。另外,与aioobe的答案中提到的函数相比,此函数不使用accumarray函数,这就是为什么它甚至与较旧版本的Matlab兼容的原因。而且,它适用于单元格数组和数字数组。

解决方案:您可以将此功能与内置的matlab函数“唯一”结合使用。

出现次数=计数成员(唯一(M),M)

enceance_count将是一个数字数组,其大小与unique(M)的大小相同,并且enceance_count数组的不同值将对应于unique(M)中相应值(相同索引)的计数。


2

使用nnz代替sum。不需要两次调用就可以将矩阵折叠成向量,并且可能比求和要快。

nnz(your_matrix == 5)

文件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.