Как узнать среднее значение каждой группы чисел в y, которые имеют одинаковый индекс в x? - PullRequest
3 голосов
/ 14 декабря 2011

Я хочу написать такой код для двух матриц:

x=[1 1 1 2 2 3 3 3 3]';
y=[11 21 31 24 32 33 13 37 3]';

Как узнать среднее значение каждой группы чисел в y, которые имеют одинаковый индекс в x?

Мой алгоритм может выглядеть следующим образом:

If     x(1)=x(2) counter1=1 sum1=y(1)+y(2) 
       x(2)=x(3) counter1=2 sum1=sum+y(3)  Define  newx1=x(1) newy1=sum1/counter1
       x(3)<>x(4) 
       x(4)=x(5) counter2=1 sum2=y(4)+y(3)  Define  newx2=x(4) newy2=sum2/counter2
       x(5)<>x(6) 
       x(6)=x(7) counter3=1 sum3=y(6)+y(7)  
       x(7)=x(8) counter3=2 sum3=sum+y(8)  
       x(8)=x(9) counter3=3 sum3=sum+y(9)  Define  newx1=x(6) newy3=sum3/counter3

Моя проблема здесь заключается в использовании более двух счетчиков в цикле.Вероятно, я должен написать что-то вроде:

s=1:8
for k=1:9
if x(k)=x(k+s);
else
s=s+1;
end
end

, которое не сработало :( Я буду рад любой помощи или совету!

Ответы [ 3 ]

1 голос
/ 15 декабря 2011

Одним из решений является использование функции GRPSTATS , доступной в Statistical Toolbox.Он может применять функцию по группам:

x=[1 1 1 2 2 3 3 3 3]';
y=[11 21 31 24 32 33 13 37 3]';
grpstats(y,x,@mean)

Альтернативный вариант (например, если у вас нет Statistical Toolbox) - использовать отправку GROUP2CELL в FileExchange.Он помещает числа, соответствующие определенной категории, в отдельную ячейку в массиве ячеек.Затем вы можете применить множество функций, в том числе среднее с CELLFUN:

cellfun(@mean,group2cell(y,x))
1 голос
/ 14 декабря 2011

Если я вас правильно понял, вам нужно среднее значение для каждой группы чисел с одинаковым индексом в «х».В таком случае ...

function FindAverages
x=[1 1 1 2 2 3 3 3 3]';
y=[11 21 31 24 32 33 13 37 3]';

means = [];
indexes = unique(x);
for i=1:numel(indexes)
    index = indexes(i);
    indexInY = (x==index);
    means(end+1) = mean(y(indexInY));
end
disp(means);
0 голосов
/ 25 февраля 2014

Если я правильно понял ваш вопрос, вы могли бы просто использовать accmarray, он должен работать быстрее, чем цикл.

%#Input
x=[1 1 1 2 2 3 3 3 3]';
y=[11 21 31 24 32 33 13 37 3]';

[newx, idx]=unique(x,'legacy');
newy=accumarray(x(:),y(:),[],@mean);  %#groups every element of 'y' according to the index of 'x' and applies the function '@fun' to each group.
%#Output
newy =[21.0000 28.0000 21.5000];
newx=[1 2 3];     %#returns the index used for each group
idx=[3 5 9];      %#returns the index of the last observation for each group
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...