如果我有一个mxn单元格数组,其元素是整数或整数矢量,我如何计算整个单元格数组中出现特定整数的次数?整数可以单独出现在单元格中或单元格中的向量中。单元格数组中出现特定元素的次数
我的细胞会是这样的:
cell = { 1,2,3,4,5; [6,7,1], 2,7,8,9; 1,3,9,10, [1,2] }
如果我有一个mxn单元格数组,其元素是整数或整数矢量,我如何计算整个单元格数组中出现特定整数的次数?整数可以单独出现在单元格中或单元格中的向量中。单元格数组中出现特定元素的次数
我的细胞会是这样的:
cell = { 1,2,3,4,5; [6,7,1], 2,7,8,9; 1,3,9,10, [1,2] }
一个简单的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
中的所有条目)可以计算给定元素的出现次数。
'ismember'可能是错误的选择,例如'{[1 1 1]}' – Daniel
对于您的问题,这是不相干的元素位于你的细胞,开始扁平化数据结构到一个简单的载体:
计数元素,运用histcounts
是一个不错的选择
[x,c]=histcounts(v,min(v):max(v));
其不依赖于
v
含整数的
一个更通用的解决方案是:
[x,c]=histcounts(v,unique(v));
在这两种情况下x都会返回v中对应值的频率。
如果您的MATLAB版本不知道histcounts
功能,使用变量名,比如`cell`它也内置函数hist
避免更换。 – Daniel