Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 特定元素在单元格数组中出现的次数_Matlab - Fatal编程技术网

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

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

如果我有一个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);
如果
单元格{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]}