matlab loops vectorization

Introducción a la vectorización en MATLAB: ¿algún buen tutorial?



loops vectorization (3)

Aquí hay un par de tutoriales de MathWorks que a menudo enlace como referencias sobre el tema:

Y esta es una de las publicaciones de Loren en el blog que tiene un buen recorrido de vectorización de código para un problema de muestra en particular:

El tipo particular de problema que proporcionó como muestra, que implica procesar submatrices de una matriz determinada, se puede vectorizar de diferentes maneras, dependiendo en gran medida del tipo de operación que esté realizando. Es posible que pueda usar CONV2 o FILTER2 en lugar de sus bucles for anidados. También hay una serie de funciones en la Caja de herramientas de procesamiento de imágenes que manejan el proceso de vecindad y bloqueo de matrices , como NLFILTER y BLOCKPROC . La documentación para estas funciones debería ayudarlo a descubrir cómo usarlas como una forma de vectorizar su código.

Estoy buscando buenos tutoriales sobre vectores (bucles) en MATLAB.

Tengo un algoritmo bastante simple, pero usa dos bucles for . Sé que debería ser simple vectorizarlo y me gustaría aprender cómo hacerlo en lugar de pedirle la solución.

Pero para hacerte saber qué problema tengo, para que puedas sugerir los mejores tutoriales que muestran cómo resolver problemas similares, aquí está el resumen de mi problema:

B = zeros(size(A)); % //A is a given matrix. for i=1:size(A,1) for j=1:size(A,2) H = ... %// take some surrounding elements of the element at position (i,j) (i.e. using mask 3x3 elements) B(i,j) = computeSth(H); %// compute something on selected elements and place it in B end end

Entonces, NO estoy pidiendo la solución. Estoy pidiendo buenos tutoriales, ejemplos de vectores de bucles en MATLAB. Me gustaría aprender cómo hacerlo y hacerlo por mi cuenta.


La regla de oro es que debe usar funciones de matlab integradas que operan en arreglos en lugar de bucles siempre que sea posible. Por ejemplo, me parece que el problema que ha descrito puede formularse como una convolución, y luego puede usar las conv2() o filter() matlab para implementarlo sin el bucle.

Otro truco general es tratar de formular su problema en términos de operaciones matriciales.

También deberías preferir el espacio comercial por tiempo. Digamos que tienes un vector n-dimensional v y una matriz mxn M , donde cada fila es también un vector n-dimensional. Digamos que quieres las distancias euclidianas entre v y cada fila de M En este caso, debe usar repmat() para crear una matriz que contenga m copias de v , y calcule las distancias utilizando operaciones de matriz de elementos sin un bucle.


Hay un pequeño informe que hice hace un año para explicar un truco que encontré después de haber pasado 3 años escribiendo el código de Matlab diariamente, a menudo pasando demasiado tiempo vectorizando todo.

http://www.gyomalin.com/reasonable_vectorization.html

La idea principal es que puede recorrer un largo camino simplemente al vectorizar su código a lo largo de una dimensión. Algunos de ustedes ya habrán descubierto ese truco, pero creo que vale la pena ser llamado un patrón de diseño de Matlab.