Вы можете использовать умножение матриц:
r = 1:numel(bins);
result = (r.' == repelem(r,bins)) * data .* (1./bins(:));
Если вы хотите вывод в виде ячейки:
result = num2cell(result,2);
Для больших матриц лучше использовать разреженную матрицу:
result = sparse(r.' == repelem(r,bins)) * data .* (1./bins(:));
Примечание: в предыдущих версиях MATLAB вы должны использовать bsxfun
:
result = bsxfun(@times,bsxfun(@eq, r.',repelem(r,bins)) * data , (1./bins(:)))
Вот результат синхронизации трех предложенных методов в Octave:
Умножение матриц:
0.00197697 seconds
Accumarray:
0.00465298 seconds
Cellfun:
0.00718904 seconds
РЕДАКТИРОВАТЬ:
Для матрицы 200 x 100000:
Умножение матриц:
0.806947 seconds sparse: 0.2331 seconds
Accumarray:
0.0398011 seconds
Cellfun:
0.386079 seconds