Introduction à la vectorisation dans MATLAB - de bons tutoriels?
Je suis à la recherche de tout bon tutoriels sur la vectorisation (boucles) dans MATLAB.
J'ai assez simple algorithme, mais il utilise deux for
boucles. Je sais qu'il doit être simple à vectoriser et je voudrais savoir comment le faire plutôt que de vous demander la solution.
Mais pour vous permettre de savoir quel est le problème que j'ai, donc vous serez en mesure de suggérer des meilleurs tutoriels qui sont montrant comment résoudre des problèmes similaires, voici le plan de mon problème:
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
Donc, je ne demande PAS de la solution. Je vous demande un bon tutoriels, des exemples de vectoriser des boucles dans MATLAB. Je voudrais savoir comment faire et de le faire sur mon propre.
source d'informationauteur Gacek
Vous devez vous connecter pour publier un commentaire.
Ici sont un couple de MathWorks tutoriels, j'ai souvent le lien à titre de références sur le sujet:
Et voici un de Loren de billets de blog qui a un beau procédure pas à pas du code de la vectorisation pour un échantillon particulier de problème:
Le type de problème que vous avez donné comme un échantillon, qui comprend le traitement submatrices d'une matrice donnée, pourrait être vectorisé de différentes manières en fonction grandement sur ce genre d'opération que vous faites. Vous pouvez être en mesure d'utiliser CONV2 ou FILTRE2 au lieu de votre boucles for imbriquées. Il y a également un certain nombre de fonctions dans le Boîte À Outils De Traitement D'Image que la poignée de quartier et de bloquer le traitement de matricescomme NLFILTER et BLOCKPROC. La documentation de ces fonctions devraient vous aider à comprendre comment l'utiliser comme un moyen de vectoriser votre code.
Il y a un petit article que j'ai fait il y a un an à expliquer un truc que j'ai trouvé après avoir passé 3 ans à l'écriture de code Matlab quotidien, souvent, passer trop de temps sur la vectorisation de tout.
http://www.gyomalin.com/reasonable_vectorization.html
L'idée principale est que vous pouvez obtenir un long chemin juste par la vectorisation de votre code le long d'une dimension. Certains d'entre vous ont déjà découvert cette astuce, mais je pense qu'il vaut la peine d'être appelé un Matlab motif de conception.
La règle de base est que vous devez utiliser intégré dans matlab fonctions qui opèrent sur des tableaux à la place des boucles à chaque fois que possible. Par exemple, il me semble que le problème que vous avez décrit peut être formulé comme un produit de convolution, et puis vous pouvez utiliser matlab
conv2()
oufilter()
fonctions à mettre en œuvre sans la boucle.Une autre astuce consiste à essayer de formuler votre problème dans les termes de la matrice des opérations.
Vous devriez également préférer la négociation de l'espace pour le temps. Disons que vous avez un n-dimensions vecteur
v
et une m x n de la matriceM
où chaque ligne est également un n-dimensions du vecteur. Disons que vous voulez que les distances Euclidiennes entrev
et chaque ligne deM
. Dans ce cas, vous devez utiliserrepmat()
pour créer une matrice contenant des m copies dev
et de calculer les distances à l'aide de l'élément de sage opérations de matrice sans boucle.