2016-02-22 2 views
0

У меня есть 2 вектора длины 200, скажем, A и B; то я нахожу каждый второй процентиль массива A, используя A1 = prctile (A, [1: 2: 100], 1); , так что A1 представляет собой массив длиной 50. Теперь я хочу найти среднее из элементов A, которые попадают в каждый два элемента A1 (т. Е. Средний из элементов A между 2-м и 4-м процентилем), а также средний соответствующий Элементы B.Средние элементы массива между 2 процентилями

ответ

2

Моей идеей решить эту проблему с хорошей производительностью является создание вектора «метки», который присваивает метке (число от 1 до 51) каждому из бункеров, определяемых 50 процентилями.

%Get the indices where each new percentile bin starts 
[sortedA,indexA]=sort(A); 
sortedB=B(indexA); 
percentile_indices=ceil(prctile(1:numel(A), [1:2:100])); 
label=zeros(size(A)); 
label([1,percentile_indices])=1; 
%Convert this to a vector which assigns an index to each bin 
label=cumsum(label); 
%accumulate. Take the mean of all values with the same label. 
prctileMeanA=accumarray(label(:),sortedA,[],@mean); 
prctileMeanB=accumarray(label(:),sortedB,[],@mean); 
+0

Спасибо Даниилу, что решает часть моей проблемы, я на самом деле хотел бы получить значения B, соответствующих, например, если элементы А внутри 2-го и 4-го процентиля [2,8,19], которые может быть 16-м, 22-м и 112-м элементом в массиве A длиной 200, тогда мне также понадобится сумма 16-го 22-го и 112-го элементов вектора B .. @ Daniel – Sourangsu

+0

@Sourangsu: Обновлен ответ. – Daniel

+0

Спасибо @ Даниэль – Sourangsu

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