Matlab 特定元素在单元格数组中出现的次数
如果我有一个mxn单元数组,其元素要么是整数,要么是整数向量,那么我如何计算特定整数在整个单元数组中出现的次数?整数可以单独出现在单元格中,也可以出现在单元格中的向量中 我的细胞将如下所示:Matlab 特定元素在单元格数组中出现的次数,matlab,Matlab,如果我有一个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)ismembe
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);
如果单元格{i,j}
包含1,则结果
将是一个二进制(布尔)矩阵,位置(i,j)为1(true
)。要计算有多少项足以将结果中的所有1相加,请执行以下操作:
numberOfItems=sum(result(:));
在我们的例子中,结果将具有以下形式:
1 0 0 0 0
1 0 0 0 0
1 0 0 0 1
这是正确的,因为1出现在单元格{1,1}
,单元格{3,1}
以及单元格{2,1}
和单元格{3,5}
中的数组中。现在我们可以计算结果
中的数值,或者简单地将整个矩阵求和(其唯一值为0和1),得到numberOfItems
为4
注意:命名单元格数组cell
是不好的做法,因为cell()
是一个内置的Matlab函数。如果使用内置Matlab函数名称命名变量或函数,则无法在脚本中使用此类内置函数
更新:正如@Daniel正确指出的那样,如果向量包含我们要查找的元素两次(或更多),那么这种解决方案可能不可靠。如果有这样一种情况,单元格
中的一个数组是[1 2 1]
,我们可能需要考虑这样一个事实:1在这个数组中出现两次。假设我们通过将结果
定义替换为
result=cellfun(@(x)sum(ismember(x,1)),cell)
现在,result
具有以下形式
1 0 0 0 0
1 0 0 0 2
1 0 0 0 1
如您所见,现在在结果(2,5)
中有2个,而不是1个。使用与以前相同的技巧(即对result
中的所有条目求和),可以计算给定元素的出现次数。一个简单的cellfun()
将对您有所帮助。
此类函数将在给定单元数组中的每个单元上执行给定函数(ismember()
)
假设我们要查找1
:
result=cellfun(@(x)ismember(1,x),cell);
如果单元格{i,j}
包含1,则结果
将是一个二进制(布尔)矩阵,位置(i,j)为1(true
)。要计算有多少项足以将结果中的所有1相加,请执行以下操作:
numberOfItems=sum(result(:));
在我们的例子中,结果将具有以下形式:
1 0 0 0 0
1 0 0 0 0
1 0 0 0 1
这是正确的,因为1出现在单元格{1,1}
,单元格{3,1}
以及单元格{2,1}
和单元格{3,5}
中的数组中。现在我们可以计算结果
中的数值,或者简单地将整个矩阵求和(其唯一值为0和1),得到numberOfItems
为4
注意:命名单元格数组cell
是不好的做法,因为cell()
是一个内置的Matlab函数。如果使用内置Matlab函数名称命名变量或函数,则无法在脚本中使用此类内置函数
更新:正如@Daniel正确指出的那样,如果向量包含我们要查找的元素两次(或更多),那么这种解决方案可能不可靠。如果有这样一种情况,单元格
中的一个数组是[1 2 1]
,我们可能需要考虑这样一个事实:1在这个数组中出现两次。假设我们通过将结果
定义替换为
result=cellfun(@(x)sum(ismember(x,1)),cell)
现在,result
具有以下形式
1 0 0 0 0
1 0 0 0 2
1 0 0 0 1
如您所见,现在在结果(2,5)
中有2个,而不是1个。使用与以前相同的技巧(即对结果
中的所有条目求和),可以计算给定元素的出现次数。对于您的问题,元素在单元格中的位置无关,请开始将数据结构展平为一个简单的向量:
v=[mycell{:}];
要对元素进行计数,使用histcounts
是一个不错的选择
[x,c]=histcounts(v,min(v):max(v));
不依赖于包含整数的v
的更通用的解决方案是:
[x,c]=histcounts(v,unique(v));
在这两种情况下,x返回在v中找到相应值的频率
如果您的MATLAB版本不知道histcounts
函数,请将其替换为hist
对于您的问题,元素在单元格中的位置无关,请开始将数据结构展平为简单向量:
v=[mycell{:}];
要对元素进行计数,使用histcounts
是一个不错的选择
[x,c]=histcounts(v,min(v):max(v));
不依赖于包含整数的v
的更通用的解决方案是:
[x,c]=histcounts(v,unique(v));
在这两种情况下,x返回在v中找到相应值的频率
如果您的MATLAB版本不知道histcounts
函数,将其替换为hist
避免使用变量名,如cell
,它们也是内置函数。避免使用变量名,如cell
,它们也是内置函数。ismember
对于{[1 2 1]}等单元格可能是错误的选择
ismember
对于{[1 2 1]}