我在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;
我想知道是否有办法避免循环并得到答案。
谢谢,
答案 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
已经是一维数组,那么这根本没有效果。它唯一能做的就是如果你的数组是一个行向量,这将转换数组,使其成为列向量。如果它已经是列向量,那么这不会改变任何东西。这是确保一维数组始终是列向量的巧妙技巧。