MATLAB: поиск статистики отсортированных данных с использованием векторизации - PullRequest
2 голосов
/ 17 января 2012

У меня есть некоторый функциональный код, который я пытаюсь ускорить, исключив цикл for.

У меня есть набор данных в парах x, y в виде двух векторов, поэтому x (k) и y (k) образуют пару. У меня также есть набор ребер (хе). Для каждого элемента j имеется набор значений x в этом элементе, определяемый как xe (j) <= x (k) <xe (j + 1). Для каждого бина я хотел бы найти среднее и стандартное отклонение всех y (k) с x (k) в этом бине. </p>

Код MATLAB, который выполняет это ниже:

[meany, standardeviation] = ystatsvsx (xdata, ydata, xe)

meany = zeros([size(ydata,1) (length(xe)-1)]);
standarddeviation = meany;   
[numx,bin] = histc(xdata, xe);
for j = 1:(length(xe) - 1)
   inds = bin == j;
   meany(j) = mean(ydata(inds));
   standarddeviation(j) = std(ydata(inds));
end

Когда значение xe большое, эта функция замедляется. Кто-нибудь есть какие-либо предложения о том, как векторизовать этот код для устранения цикла for? Количество точек данных в данном бине (numx) является переменным.

Одно предупреждение: длина (xe) * длина (xdata) в этих случаях очень велика (длина (xdata) всегда намного больше, чем длина (xe)), поэтому невозможно использовать repmat для создания длины ( xe) матрица x length (xdata).

1 Ответ

3 голосов
/ 17 января 2012

Вы можете использовать accumarray, чтобы сделать это. Попробуйте что-то вроде этого:

meany = accumarray(bin(:),ydata(:),[],@mean);
standarddeviation = accumarray(bin(:),ydata(:),[],@std);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...