Matlab 单元元素的大小

Matlab 单元元素的大小,matlab,matrix,cell,Matlab,Matrix,Cell,我有五类数据存储在单元格中 DataCell = [74035x14 single] [8063x14 single] [7244x14 single] [6895x14 single] [2510x14 single] 我想得到每一类的先验概率 所以我想这很简单 SumData = 74032 + 8063 + 7244 + 6895 + 2510; prior = [74035 8063 7244 6895 2510] / SumData; 我想知道是否有办法避免循环并得到答案 谢谢

我有五类数据存储在
单元格中

DataCell = 

[74035x14 single] [8063x14 single] [7244x14 single] [6895x14 single] [2510x14 single]
我想得到每一类的先验概率

所以我想这很简单

SumData = 74032 + 8063 + 7244 + 6895 + 2510;
prior = [74035 8063 7244 6895 2510] / SumData;
我想知道是否有办法避免循环并得到答案


谢谢,

数据单元的计数存储到一个数组中,然后将其“正常化”:


data\u counts(:)
只是一种有趣的方式,它将所有数据元素的计数相加,不管它们是什么形状。

数据单元的计数存储到一个数组中,然后将其“正常化”:


data\u counts(:)
只是一种有趣的方式,可以将所有的数据元素相加,不管它们是什么形状。

为了补充CST-Link的答案,
cellfun
有一个特殊的标志,如果您指定
“大小”
,您可以确定单元格数组中每个单元格内元素的大小。只需指定要测量其大小的维度,它将返回一个元素数组,表示特定维度中每个单元格的大小。在调用
cellfun
之前,它还将尊重您的单元格数组的任何形状。例如,如果您有一个2 x 2单元格数组,在使用
'size'
后,它将返回一个2 x 2的数值矩阵,其中每个元素都是您指定的维度的大小

因此,请执行以下操作:

data_counts = cellfun('size', DataCell, 1);
prior       = data_counts / sum(data_counts(:));
要添加到
数据计数(:)
语句中,这是MATLAB展开矩阵的方法。这将把
数据_counts
转换成一个向量,在这个向量中,它是由
a
列堆叠在一起组成的。例如,如果您有这样一个矩阵:

A  =

1   2   3   4
5   6   7   8
9  10  11  12
13  14  15  16
A(:)
会给你:

1
5
9
13
2
6
10
14
3
7
11
15
4
8
12
16

但是,如果
A
已经是一个1D数组,那么这根本没有效果。它唯一要做的是,如果数组是行向量,那么它将变换数组,使其成为列向量。如果它已经是一个列向量,那么这不会改变任何东西。这是一个巧妙的技巧,可以确保1D数组始终是列向量。

为了补充CST Link的答案,
cellfun
有一个特殊的标志,如果您指定
'size'
,您可以确定单元格数组中每个单元格内元素的大小。只需指定要测量其大小的维度,它将返回一个元素数组,表示特定维度中每个单元格的大小。在调用
cellfun
之前,它还将尊重您的单元格数组的任何形状。例如,如果您有一个2 x 2单元格数组,在使用
'size'
后,它将返回一个2 x 2的数值矩阵,其中每个元素都是您指定的维度的大小

因此,请执行以下操作:

data_counts = cellfun('size', DataCell, 1);
prior       = data_counts / sum(data_counts(:));
要添加到
数据计数(:)
语句中,这是MATLAB展开矩阵的方法。这将把
数据_counts
转换成一个向量,在这个向量中,它是由
a
列堆叠在一起组成的。例如,如果您有这样一个矩阵:

A  =

1   2   3   4
5   6   7   8
9  10  11  12
13  14  15  16
A(:)
会给你:

1
5
9
13
2
6
10
14
3
7
11
15
4
8
12
16

但是,如果
A
已经是一个1D数组,那么这根本没有效果。它唯一要做的是,如果数组是行向量,那么它将变换数组,使其成为列向量。如果它已经是一个列向量,那么这不会改变任何东西。这是一个确保1D数组始终是列向量的巧妙技巧。

数据计数
始终是一个向量,因此我认为实际上并不需要
(:)
。@Divakar我刚刚用
数据单元={0(1,14),1(2,14);0(3,14),1(4,14)};数据_计数=cellfun(@(x)大小(x,1),数据单元)数据计数结果。我使用MatlabR2012a。对,这对于二维或多维单元数组来说是有意义的。我得到了同样的结果。你可以简单地做
cellfun('size',DataCell,1)<如果您只想在单元格数组中查找每个单元格内元素的大小,code>cellfun
在内部有一个特殊的模式。@rayryeng实际上这是一个比我更优雅的解决方案。你应该把它贴出来!今天我学到了一些新东西:
编辑cellfun
是一本有趣的读物。:-)<代码>数据计数总是一个向量,所以我认为实际上并不需要
(:)
。@Divakar我刚刚用
数据单元={zero(1,14),one(2,14);zero(3,14),one(4,14)};数据_计数=cellfun(@(x)大小(x,1),数据单元)数据计数结果。我使用MatlabR2012a。对,这对于二维或多维单元数组来说是有意义的。我得到了同样的结果。你可以简单地做
cellfun('size',DataCell,1)<如果您只想在单元格数组中查找每个单元格内元素的大小,code>cellfun
在内部有一个特殊的模式。@rayryeng实际上这是一个比我更优雅的解决方案。你应该把它贴出来!今天我学到了一些新东西:
编辑cellfun
是一本有趣的读物。:-)这也应该很快!这也应该快!