细胞元素的大小

时间:2014-11-18 14:58:39

标签: matlab matrix cell

我在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;

我想知道是否有办法避免循环并得到答案。

谢谢,

2 个答案:

答案 0 :(得分:4)

DataCell的计数存储到数组中,然后"正常化"它:

data_counts = cellfun(@(x) size(x,1), DataCell);
prior       = data_counts / sum(data_counts(:));

data_counts(:)只是汇总data_counts所有元素的有趣方式,无论它们处于何种形状。

答案 1 :(得分:2)

要添加到CST-Link的答案,cellfun有一个特殊标志,如果指定'size',则可以确定单元格数组中每个单元格内元素的大小。您只需指定要测量尺寸的尺寸,然后返回一个元素数组,表示特定尺寸中每个单元格的大小。在致电cellfun之前,它还会尊重您的细胞阵列的形状。例如,如果您有一个2 x 2单元格数组,则在使用'size'后,它将返回一个2 x 2数字矩阵,其中每个元素都是您指定的维度的大小。

因此,请执行此操作:

data_counts = cellfun('size', DataCell, 1);
prior       = data_counts / sum(data_counts(:));

要添加到data_counts(:)语句,这是MATLAB 展开矩阵的方式。这样做是因为它将data_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 已经是一维数组,那么这根本没有效果。它唯一能做的就是如果你的数组是一个行向量,这将转换数组,使其成为列向量。如果它已经是列向量,那么这不会改变任何东西。这是确保一维数组始终是列向量的巧妙技巧。