2013-06-18 2 views
4

Je me demande s'il existe une solution plus rapide au problème ci-dessous que d'utiliser des boucles.Binning 3D dans Matlab

J'ai un ensemble de points dispersés dans l'espace 3D, avec une valeur affectée à chaque point. Donc, quelque chose comme dataPoints = [x1, y1, z1, v1; x2, y2, z2, v2; ...]. L'espace 3D est divisé également en sous-volumes dx × dy × dz. J'ai besoin de créer une matrice contenant la somme de v dans chaque sous-volume.

Le nombre de sous-volumes et de points de données peut être assez important, de l'ordre de 1 million chacun. Donc, les boucles sont vraiment à éviter.

Je peux facilement savoir, ce qui sous-volume un point appartient à:

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

Mais maintenant, je dois ajouter tous les points avec le même tuple (ix, iy, iz). Des idées?

Répondre

5

utilisation accumarray

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

toujours un +1 pour 'accumArray()' ':) –

+1

Entre accumarray' et' bsxfun' Je me sens comme je suis un dieu Matlab par rapport à mes pairs. –

+0

Merci! J'ai vraiment besoin de me familiariser avec 'accumarray'. – texnic