12.07.2015 Views

Algorithmes de la morphologie mathématique pour - Pastel - HAL

Algorithmes de la morphologie mathématique pour - Pastel - HAL

Algorithmes de la morphologie mathématique pour - Pastel - HAL

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Jaromír BRAMBOR4.4. PRIMITIVES DU CALCUL COMME SKELETONS ALGORITHMIQUESArrayFonction génératrice<strong>de</strong> <strong>la</strong> séquence<strong>de</strong>s in<strong>de</strong>xesFonction d’extraction<strong>de</strong>s éléments<strong>de</strong> <strong>la</strong> mémoireFlux d’in<strong>de</strong>xesdéfinissantle parcours <strong>de</strong> l’imageFlux <strong>de</strong> donnéesFIG. 4.5 : Passage d’un array à un flux <strong>de</strong> données est effectué dans <strong>la</strong> logique <strong>de</strong>s kernels d’exécutionsur les streams, elle peut profiter <strong>de</strong> toutes les techniques <strong>de</strong> parallélisation <strong>de</strong> traitement <strong>de</strong>s streams,notamment <strong>de</strong> celle <strong>de</strong> <strong>la</strong> réplication fonctionnelle modélisée par le skeleton farm, cf. page 67. L’accèsconcurrent à <strong>la</strong> mémoire est difficile à imaginer sur les architectures c<strong>la</strong>ssiques <strong>de</strong> Von Neumann, maisc’est une technique connue et utilisée sur les machines parallèles ou <strong>de</strong>s architectures dédiées.C’est cette approche <strong>de</strong> parcours <strong>de</strong> l’array et d’extraction <strong>de</strong>s éléments que nous allons utiliser <strong>pour</strong>le passage d’un array à un flux <strong>de</strong> données. Cependant, les fonctions <strong>de</strong> parcours <strong>de</strong> l’image vont nousservir également lors <strong>de</strong> <strong>la</strong> recomposition d’un array <strong>de</strong> sortie à partir d’un flux <strong>de</strong> données. Il s’agit, eneffet, du processus inverse au passage à flux <strong>de</strong> données et <strong>pour</strong> l’exprimer en formalisme fonctionnel,nous allons utiliser <strong>la</strong> fonction standard array du Haskell <strong>de</strong> création d’un array.La fonction array prend <strong>de</strong>ux arguments. Le premier argument est un tuple <strong>de</strong>s bornes minimales etmaximales <strong>de</strong>s in<strong>de</strong>x. Nous reconstituons un array <strong>de</strong> sortie à partir d’un array d’entrée qui a les mêmesbornes maximales et minimales. Nous pouvons utiliser directement <strong>la</strong> fonction du Haskell qui fournitces informations, bounds avec l’array d’entrée comme paramètre. Le <strong>de</strong>uxième argument <strong>de</strong> <strong>la</strong> fonctionarray est une liste <strong>de</strong>s tuples (in<strong>de</strong>x, valeur) qui doit contenir tous les éléments inclus dans les bornes.Nous construisons cette liste à partir <strong>de</strong> notre stream <strong>de</strong>s résultat et à partir du stream <strong>de</strong>s in<strong>de</strong>x, le mêmeque nous avons utilisé <strong>pour</strong> parcourir l’array. Nous les associons élément par élément avec <strong>la</strong> fonctionzip du Haskell.Voici un exemple <strong>de</strong> cette construction :array (bounds $ ar) (zip ixs (id ss) )where ixs = strm ar ; ss = map (ar ! ) ixsoù ar désigne l’array d’entrée, ixs est le stream <strong>de</strong>s in<strong>de</strong>x créé par <strong>la</strong> fonction strm du parcours <strong>de</strong>l’array et ss est le stream <strong>de</strong>s valeurs <strong>de</strong>s résultats. La fonction d’i<strong>de</strong>ntité id nous indique l’endroit oùnous p<strong>la</strong>çons <strong>de</strong>s fonctions exécutives effectuant un traitement sur le stream <strong>de</strong>s valeurs.4.4.4.2 Fonction indices, fonction standard du Haskell <strong>pour</strong> le parcours d’un arrayDans le cas où nous avons besoin <strong>de</strong> parcourir l’array entier mais sans poser <strong>de</strong> contrainte sur lesens du parcours, nous pouvons utiliser <strong>la</strong> fonction standard indices du Haskell. Elle nous retourne <strong>de</strong>sindices <strong>de</strong> tous les éléments <strong>de</strong> l’array par l’in<strong>de</strong>xage <strong>de</strong> ses bornes.Sachant que nous avons utilisé une fonction standard <strong>pour</strong> le passage à un flux <strong>de</strong> données, nouspouvons utiliser un mécanisme plus simple <strong>pour</strong> <strong>la</strong> recomposition <strong>de</strong> l’array <strong>de</strong> sortie en utilisant <strong>la</strong>fonction listArray du Haskell. Cette <strong>de</strong>rnière n’exige pas l’association <strong>de</strong>s éléments du flux <strong>de</strong>s résultatavec l’in<strong>de</strong>x mais travaille directement avec ce stream. L’exemple suivant illustre cette situation :listArray (bounds $ ar) (id ss)where ixs = indices ar ; ss = map (ar ! ) ixs71

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!