如果我有一个mxn单元格数组,其元素是整数或整数向量,我怎么能计算整个单元格数组中特定整数出现的次数?整数可以单独出现在单元格中或单元格中的向量中。
我的细胞看起来像这样:
cell = { 1,2,3,4,5; [6,7,1], 2,7,8,9; 1,3,9,10, [1,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
中的所有条目求和),它可以计数给定元素的出现次数。