Найдите среднее значение подматрицы, если первый столбец матрицы содержит значения индекса.

Для заданной матрицы Z и при условии, что первый столбец относится к значениям индекса, можно ли найти среднее значение Z(:,2:3) на основе значений индекса в первом столбце Z(:,1).

Z  =  [1    3    4
       2    7    8
       1    3    9
       3    4    4
       1    5    7]

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

Z1  =    3  4
         3  9
         5  7

Пожалуйста, кто-нибудь может помочь, объяснив, как это сделать?


person dts86    schedule 06.05.2014    source источник


Ответы (4)


Это должно помочь:

mean(mean(Z(Z(:,1)==1,2:3)))
person Ghaul    schedule 06.05.2014
comment
Большое спасибо Гуль! На самом деле мне удалось решить мою проблему без второго среднего. - person dts86; 09.05.2014

Как насчет:

mean([accumarray(Z(:,1), Z(:,2),[],@mean), accumarray(Z(:,1), Z(:,3),[],@mean)]')'

Это дает вам среднее значение, соответствующее каждому числу. т. е. первая строка результата является средним значением для строк, соответствующих 1, вторая строка - для 2 и т. д.

person Dan    schedule 06.05.2014
comment
Спасибо, что научили меня «accumarray()», это довольно хорошее решение. - person Ghaul; 06.05.2014

Bsxfun подход -

Zc = [Z(:,1) mean(Z(:,[2 3]),2)]

ind1 = bsxfun(@eq,Zc(:,1),min(Zc(:,1)):max(Zc(:,1)))
mean_values = sum(bsxfun(@times,ind1,Zc(:,2)))./sum(ind1,1)

Выход -

mean_values =
    5.1667    7.5000    4.0000
person Divakar    schedule 06.05.2014

Чтобы сделать это для каждого индекса в столбце 1 сразу:

>> accumarray(repmat(Z(:,1),size(Z,2)-1,1), reshape(Z(:,2:3),[],1), [], @mean)
ans =
    5.1667
    7.5000
    4.0000
person Luis Mendo    schedule 06.05.2014