有谁知道如何计算一个值出现在矩阵中的次数?
例如,如果我有一个1500 x 1矩阵M
(向量),该矩阵存储工作日(1-7)的值,那么我该如何计算多少个星期日(1),星期一(2),...,星期六(7)被存储在M
?
Answers:
sum(your_matrix(:) == 5)
sum(your_matrix == [ 1, 2, 3 ])
这是我计算唯一元素时可以想到的所有方法的列表:
M = randi([1 7], [1500 1]);
t = tabulate(M);
counts1 = t(t(:,2)~=0, 2);
counts2_1 = hist( M, numel(unique(M)) );
counts2_2 = histc( M, unique(M) );
counts3 = accumarray(M, ones(size(M)), [], @sum);
%# or simply: accumarray(M, 1);
[MM idx] = unique( sort(M) );
counts4 = diff([0;idx]);
counts5 = arrayfun( @(x)sum(M==x), unique(M) );
counts6 = sum( bsxfun(@eq, M, unique(M)') )';
counts7 = full(sparse(M,1,1));
M = [1 2 100000]
,选项2,counts2_1 = hist( M, numel(unique(M)) )
给出[2 0 1]
哪个不够好,是吗?应该是公正的counts2_1 = hist( M, unique(M) )
。
hist(data,nbins)
(在这种情况下,范围[min(data),max(data)]
划分为相等大小的N
-bins)2)它也可以将bin中心指定为hist(data,xvalues)
,假设xvalues
为3)或在矢量xvalues
不是均匀分布的情况下,则将连续值之间的中点用作bin边。
hist
内部代码最终都会调用该histc
函数(请检查源代码edit hist.m
,而这histc
是一个内置函数)。因此,我认为最好避免hist
在这里直接histc
使用显式的bin边缘进行调用,如我上面所示。
1
。请参阅有关如何处理一般较多的情况下如下回答:stackoverflow.com/a/4093228/97160,stackoverflow.com/a/6933863/97160
您可以一次对所有值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
这将是完美的原因,因为我们正在对矩阵进行运算,并且答案应该是一个数字
sum(sum(matrix==value))
这是Matlab Central File Exchange上可用的非常好的功能文件。
此功能文件已完全矢量化,因此非常快捷。另外,与aioobe的答案中提到的函数相比,此函数不使用accumarray函数,这就是为什么它甚至与较旧版本的Matlab兼容的原因。而且,它适用于单元格数组和数字数组。
解决方案:您可以将此功能与内置的matlab函数“唯一”结合使用。
出现次数=计数成员(唯一(M),M)
enceance_count将是一个数字数组,其大小与unique(M)的大小相同,并且enceance_count数组的不同值将对应于unique(M)中相应值(相同索引)的计数。