特定元素出现在单元格数组中的次数

时间:2016-03-12 19:44:07

标签: matlab

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

我的细胞看起来像这样:

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

2 个答案:

答案 0 :(得分:2)

对于您的问题,元素位于单元格中的位置无关紧要,请将数据结构展平为简单的向量:

v=[mycell{:}];

要计算元素,使用histcounts是一个不错的选择

[x,c]=histcounts(v,min(v):max(v));

不依赖于v包含整数的更通用的解决方案是:

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

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

如果您的MATLAB版本不知道histcounts函数,请将其替换为hist

答案 1 :(得分:0)

一个简单的cellfun()会帮助你 这样的函数将在给定单元格数组中的每个单元格上执行给定的函数(在我们的例子中为ismember()) 我们想说我们想找1

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

result将是一个二进制(布尔)矩阵,如果true包含1,则位置(i,j)为1(cell{i,j})。计算有多少项是足以将result中的所有1加起来:

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中的所有条目求和),它可以计数给定元素的出现次数。