2016-03-12 99 views
0

如果我有一个mxn单元格数组,其元素是整数或整数矢量,我如何计算整个单元格数组中出现特定整数的次数?整数可以单独出现在单元格中或单元格中的向量中。单元格数组中出现特定元素的次数

我的细胞会是这样的:

cell = { 1,2,3,4,5; [6,7,1], 2,7,8,9; 1,3,9,10, [1,2] } 
+1

避免更换。 – Daniel

回答

0

一个简单的cellfun()会帮助你。
这样的函数将对给定单元格阵列中的每个单元格执行给定函数(在我们的例子中为ismember())。
比方说,我们要寻找1

result=cellfun(@(x)ismember(1,x),cell); 

result将与在位置1(true)(I,J)如果cell{i,j}包含1的二进制(布尔)矩阵计算有多少项目有足够的总结所有的1 result

numberOfItems=sum(result(:)); 

在我们的话,那么,result将有以下形式:

1  0  0  0  0 
1  0  0  0  0 
1  0  0  0  1 

并且这是正确的,因为1出现在cell{1,1},cell{3,1}以及cell{2,1}cell{3,5}中的阵列中。现在,我们可以指望的那些在result,或简单地总结整个矩阵(其值只有0和1),以获得numberOfItems为4

:命名单元阵列cell是不好的做法,因为cell()是内置Matlab函数。如果您使用内置的Matlab函数名称命名变量或函数,您将无法在脚本中使用此类内置函数。

更新:作为@Daniel正确地指出,如果向量包含了我们正在寻找的两倍(或更多)的元素这样的解决方案可能不会强劲。如果出现这种情况,我们假设cell中的一个数组是[1 2 1],我们可能想要考虑1在该数组中出现两次的事实。所以我们可以说我们设置cell{2,5}=[1 2 1],通过更换result定义

result=cellfun(@(x)sum(ismember(x,1)),cell) 

现在result的形式

1  0  0  0  0 
1  0  0  0  2 
1  0  0  0  1 

,正如你可以看到,现在在result(2,5)有2,而不是1使用非常与之前相同的技巧(即总结result中的所有条目)可以计算给定元素的出现次数。

+0

'ismember'可能是错误的选择,例如'{[1 1 1]}' – Daniel

2

对于您的问题,这是不相干的元素位于你的细胞,开始扁平化数据结构到一个简单的载体:

​​

计数元素,运用histcounts是一个不错的选择

[x,c]=histcounts(v,min(v):max(v)); 
其不依赖于 v含整数的

一个更通用的解决方案是:

[x,c]=histcounts(v,unique(v)); 

在这两种情况下x都会返回v中对应值的频率。

如果您的MATLAB版本不知道histcounts功能,使用变量名,比如`cell`它也内置函数hist