2012-01-17 4 views
2

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

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

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 

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

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

ответ

3

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

meany = accumarray(bin(:),ydata(:),[],@mean); 
standarddeviation = accumarray(bin(:),ydata(:),[],@std); 
+0

и если у нас есть три вектора, как это работает? – user1331843