2010-05-19 14 views
11

Estoy buscando buenos tutoriales sobre vectorización (loops) en MATLAB.Introducción a la vectorización en MATLAB: ¿algún buen tutorial?

Tengo un algoritmo bastante simple, pero utiliza 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 hacerle saber cuál es el problema que tengo, por lo que sería capaz de sugerir mejores tutoriales que están mostrando cómo resolver problemas similares, aquí está el contorno 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 

lo tanto, yo' NO estoy preguntando por 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.

Respuesta

6

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

Y aquí es una de las entradas del blog de Loren que tiene un buen tutorial de vectorización de código para un problema de muestra en particular:

El tipo particular de problema que dio como una muestra, que consiste en submatrices de procesamiento de una matriz dada, se puede vectorizada de diferentes maneras dependiendo en gran medida de qué tipo de operación que está haciendo. Puede utilizar CONV2 o FILTER2 en lugar de sus bucles anidados. También hay una serie de funciones en el Image Processing Toolbox que manejan neighborhood and block processing of 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.

+2

Me atrevería a argumentar en contra del uso de blockproc si puede evitarlo, es muy lento (también sufrió un cambio incompatible entre 2009a y 2009b). Si tiene suficiente memoria RAM, siempre es preferible ejecutar 'im2col' y aplicar la función de una vez. – Jonas

+0

@Jonas: es bueno saberlo. En realidad, no uso BLOCKPROC con la frecuencia suficiente para haber encontrado esos problemas. Solo lo estaba enumerando como una de las opciones que el OP podría querer investigar. – gnovice

1

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

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

También debería preferir el espacio comercial por tiempo. Supongamos que tiene un vector n-dimensional v y una matriz m x n M, donde cada fila es también un vector n-dimensional. Supongamos que quiere 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 bucle.

3

Hay una pequeña reseña 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 se puede obtener un largo camino sólo por la vectorización de 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.

+0

bueno, gracias! – Gacek

Cuestiones relacionadas