2013-06-18 4 views
4

Интересно, есть ли более быстрое решение проблемы ниже, чем использование циклов.3D binning в Matlab

У меня есть набор точек, разбросанных в трехмерном пространстве со значением, присвоенным каждой точке. Так что-то вроде dataPoints = [x1, y1, z1, v1; x2, y2, z2, v2; ...]. 3D-пространство равномерно разбивается на подвыборы dx × dy × dz. Мне нужно создать матрицу, содержащую сумму v в каждом подвыполнении.

Количество подвыборов и точек данных может быть довольно большим, порядка 1 миллиона каждый. Поэтому циклы действительно следует избегать.

я могу легко узнать, что подтом точки принадлежит:

ix(:) = floor(x(:)/dx) + 1; 
iy(:) = floor(y(:)/dy) + 1; 
iy(:) = floor(z(:)/dz) + 1; 

Однако теперь мне нужно сложить все очки с тем же кортежем (ix, iy, iz). Есть идеи?

ответ

5

использование accumarray

sums = accumarray({ iy(:), ix(:), iz(:) }, v(:)); 
+0

Всегда +1 для 'accumarray()' :) –

+1

Между 'accumarray' и' bsxfun' Я чувствую, что я бог MATLAB по сравнению с моими коллегами. –

+0

Спасибо! Мне действительно нужно справиться с 'tankarray'. – texnic