Question

Je cherche des bons tutoriaux sur la vectorisation (boucles) dans Matlab.

J'ai algorithme assez simple, mais il utilise deux boucles de for. Je sais qu'il doit être simple à vectoriser et je voudrais savoir comment le faire au lieu de vous demander la solution.

Mais pour vous laisser savoir quel problème je, vous seriez en mesure de proposer les meilleurs tutoriels qui montrent comment résoudre des problèmes similaires, voici les grandes lignes 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

Alors, je ne demande pas la solution. Je demande un bon tutoriels, des exemples de boucles vectorisation dans Matlab. Je voudrais savoir comment le faire et le faire moi-même.

Était-ce utile?

La solution

Voici quelques tutoriels MathWorks je lien souvent comme des références sur le sujet:

Et les messages est ici l'un des blog de Loren qui a une belle visite virtuelle code vectorisation pour un problème particulier de l'échantillon:

Le type de problème que vous avez donné un échantillon, ce qui implique le traitement de sous-matrices d'une matrice donnée, pourrait être vectorisé de différentes manières selon beaucoup sur ce genre d'opération que vous faites. Vous pourrez peut-être utiliser CONV2 ou FILTER2 au lieu de votre emboîtés pour les boucles. Il y a aussi un certain nombre de fonctions dans le Boîte à outils de traitement d'image poignée traitement de voisinage et bloc de matrices , comme NLFILTER et BLOCKPROC . La documentation de ces fonctions devrait vous aider à comprendre comment les utiliser comme un moyen de vectoriser votre code.

Autres conseils

Il y a un petit résumé que je l'ai fait il y a un an pour expliquer un truc que j'ai trouvé après avoir passé 3 ans à écrire un code Matlab quotidien, souvent passé trop de temps à tout vectorisation.

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

L'idée principale est que vous pouvez obtenir un long chemin juste en vectorisation votre code le long d'une dimension. Certains d'entre vous ont déjà découvert ce truc, mais je pense que ça vaut la peine d'être appelé un modèle de conception Matlab.

La règle de base est que vous devez utiliser les fonctions Matlab intégré qui fonctionnent sur des réseaux en place de boucles chaque fois que possible. Par exemple, il me semble que le problème que vous avez décrit peut être formulé comme une convolution, et vous pouvez utiliser les fonctions de conv2() Matlab ou filter() à mettre en œuvre sans la boucle.

Une autre astuce générale est d'essayer de formuler votre problème en termes d'opérations de la matrice.

Vous devriez aussi préférer un espace commercial pour le temps. Disons que vous avez un n dimensions vecteur v et un m x n matrice M, où chaque ligne est aussi un vecteur de dimension n. Disons que vous voulez que les distances euclidiennes entre v et chaque rangée de M. Dans ce cas, vous devez utiliser repmat() pour créer une matrice contenant des copies m de v, et calculer les distances en utilisant des opérations de tableau élément par élément sans boucle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top