我有一个简单的问题。
我有这段代码:
unset SESSION_MANAGER
条形图代表按姓氏划分的子编号。例如,30个家庭有0个孩子,10个家庭有5个孩子。
我想通过家人获得孩子的平均水平,当然我不能只使用平均值(测试)。
答案 0 :(得分:2)
我们可以轻松地以一种形式转换您的数据,其中向量的每个条目代表一个具有子项数值的族的观察。这样我们就可以生成一个长度为系列总数的向量。每个条目都是一个代表被观察家庭子女数量的数字。
为此,我们可以使用arrayfun
和repmat
重复cnt
中的条目,与test
中的相应系列一样多次。由于arrayfun
的输出是一个单元格数组,因此我们需要使用cell2mat
将其转换回正常的'矩阵。之后,obs
是上面提到的矢量。现在,我们只需使用mean
或var
来计算您的需求。
以下是一个例子:
test = [30,40,60,30,20,10, 5 ,5, 3] % families
cnt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8] % children per family in test
obs = arrayfun(@(s,c)repmat(c,1,s),test,cnt,'UniformOutput',false);
obs = cell2mat(obs);
mean(obs) % mean
var(obs) % variance
结果如下:
ans =
2.3103
ans =
3.2349
注意:我假设有30个家庭有0个孩子(正如你的文字所说)而不是30个家庭有一个孩子(正如你的条形图所说)。只需调整cnt
即可满足您的需求。
要从test
获取cnt
和obs
,您可以像这样使用hist
:
[test,cnt] = hist(obs,unique(obs));
要创建条形图,请使用带有两个参数的bar
。这样您就拥有了正确的x值(在本例中为cnt
)。
bar(cnt,test)
xlabel('Children per family')
ylabel('Number of Families')