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

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

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

177531 次浏览

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

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

sum(your_matrix == 5)

可以同时对所有值1到7执行此操作的一种方法是使用函数 精确:

>> 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

下面是我能想到的所有计算独特元素的方法:

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: 累加数组

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));

这是一个非常好的函数文件可在 Matlab 中央文件交换。

计数器。 m 链接

这个函数文件是完全向量化的,因此非常快。另外,与 aioobe 的回答中提到的函数相比,这个函数没有使用累加数组函数,这就是为什么它甚至与旧版本的 Matlab 兼容。此外,它适用于单元格数组和数值数组。

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

Event _ count = count member (only (M) ,M)

Event _ count 将是一个数值数组,其大小与 only (M)的大小相同,而且鉴别 _ count 数组的不同值将对应惟一(M)中相应值(相同索引)的计数。

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

n = histc(M,w)

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

n = histc(M,unique(M))

它就像一个命令 SQL 组!

这是完美的,因为我们正在做矩阵运算,答案应该是一个单一的数字

sum(sum(matrix==value))

使用 nnz 代替 sum。不需要重复调用向量的折叠矩阵,它可能比 sum 更快。

nnz(your_matrix == 5)

医生