2015-07-18 2 views
0

У меня есть простая проблема.вычислить средний балл по оси x

У меня есть этот код:

test = [30,40,60,30,20,10,5,5,3] 
bar(test) 

Строка представляет число ребенка семьей. Например, 30 семей имеют 0 детей и 10 семей, имеют 5 детей.

Я хочу, чтобы средний ребенок получил семью, и, конечно, я не могу просто использовать средний (тест).

+1

Постарайся выписав уравнение вы бы использовать, чтобы решить эту проблему вручную, и я думаю, вы можете понять, как реализовать его в Matlab. – cxrodgers

ответ

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') 

example_barplot

+0

Так что я не могу использовать среднее значение. Мне нужно переписать значение. И если я хочу дисперсию? – sushi

+0

@sushi: Я полностью отредактировал свой ответ, чтобы использовать другой метод и предоставил некоторую дополнительную информацию. – Matt

Смежные вопросы