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...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Jaromír BRAMBOR6.3. ALGORITHMES RAPIDES SIMD DE TRANSPOSITION ET DE ROTATIONque nous pouvons nommer ys 1 et ys 2 et qui sont p<strong>la</strong>cées dans un tuple (ys 1 , ys 2 ) et sur lesquelles nousexécutons récursivement <strong>la</strong> fonction interne select. Ainsi, les éléments <strong>de</strong> <strong>la</strong> liste xs sont distribués enalternance vers les <strong>de</strong>ux listes ys 1 et ys 2 , les premiers n éléments vers <strong>la</strong> liste ys 1 , les n éléments suivantsdans <strong>la</strong> liste ys 2 , les n suivants vers <strong>la</strong> liste ys 1 , etc... Quand nous arrivons à <strong>la</strong> fin <strong>de</strong> <strong>la</strong> liste d’entrée, <strong>la</strong>liste <strong>de</strong>s tuples <strong>de</strong> sortie est créée en utilisant l’expression (uncurry$zip).Pour mieux comprendre l’emploi <strong>de</strong> cette fonction, nous concrétisons <strong>la</strong> définition du stream <strong>de</strong>stuples <strong>de</strong>s vecteurs paquetés pairs dans l’algorithme 6.3. Pour un stream concret [1, 2, 3, 4, 5, 6, 7, 8]nous obtenons :après l’application <strong>de</strong> listDivAlter$4 sur ce stream (comme dans tr2DDiag8x8bf1) :pairs = [ (1,5) , (2,6) , (3,7) , (4,8) ]après l’application <strong>de</strong> listDivAlter$2 sur ce stream (comme dans tr2DDiag8x8bf2) :pairs = [ (1,3) , (2,4) , (5,7) , (6,8) ]après l’application <strong>de</strong> listDivAlter$1 sur ce stream (comme dans tr2DDiag8x8bf3) :pairs = [ (1,2) , (3,4) , (5,6) , (7,8) ]Ce qui correspond au réseau d’interconnexions <strong>de</strong>s papillons <strong>pour</strong> cette opération, comme présenté sur<strong>la</strong> fig. 6.4.Les définitions <strong>de</strong>s fonctions tr2DDiag8x8bf1, tr2DDiag8x8bf2 et tr2DDiag8x8bf3, bien qu’ellessoient explicites, utilisent une prescription qui énumère les éléments. Nous pouvons apercevoir égalementqu’elles sont très semb<strong>la</strong>bles car le cœur <strong>de</strong> leur fonctionnement est donné par une et mêmeexpression :( (map ( shflo $ 1) pairs) , (map ( shfhi $ 1) pairs) )Ils diffèrent dans <strong>la</strong> manière <strong>de</strong> composer le stream <strong>de</strong>s paires d’entrée pairs par <strong>la</strong> fonction listDivAlter,mais également dans <strong>la</strong> composition du stream <strong>de</strong> sortie par <strong>la</strong> fonction alter.Nous allons exploiter <strong>de</strong>s points communs et nous allons récrire ces définitions d’une façon encoreplus simple et généralisée non seulement <strong>pour</strong> les macro blocs <strong>de</strong> 8 × 8 éléments, mais également <strong>pour</strong>un cas général d’un macro bloc <strong>de</strong> N × N éléments, N = 2 n et n = 1, 2, 3, ... Ainsi, nous arrivonsà <strong>la</strong> définition <strong>de</strong> l’algorithme généralisé qui n’utilise que <strong>de</strong>ux fonctions, tr2DDiagNxPVecNbfi et <strong>de</strong>tr2DDiagNxPVecNbf et qui est défini par l’algorithme 6.4 :Algorithme 6.4 : tr2DDiagNxPVecNbf, fonction généralisée <strong>de</strong> transposition d’un macro bloc pardiagonale. Elle utilise en interne <strong>la</strong> fonction tr2DDiagNxPVecNbfi1 tr2DDiagNxPVecNbf :: [ PVec I α] → [ PVec I α]2 tr2DDiagNxPVecNbf ss = pipe ( map tr2DDiagNxPVecNbfi rs ) $ ss3 where n = rangeSize ◦ bounds $ (ss ! ! 0) ; rs = seqPow2 (div n 2)45 tr2DDiagNxPVecNbfi :: I → [ (PVec I α)] → [ (PVec I α)]6 tr2DDiagNxPVecNbfi p xs7 = alter p ( (map ( shflo $ 1) pairs) , (map ( shfhi $ 1) pairs) )8 where pairs = listDivAlter p xsUne seule fonction, tr2DDiagNxPVecNbfi, définit maintenant tous les groupes <strong>de</strong>s shuffles <strong>pour</strong> <strong>la</strong>transposition par diagonale. Cette fonction modifie son comportement selon le paramètre p choisissantainsi <strong>la</strong> bonne configuration <strong>de</strong>s éléments d’entrée. La valeur <strong>de</strong> p est une <strong>de</strong>s valeurs <strong>de</strong> séquence rs <strong>de</strong>spuissances <strong>de</strong> 2 définie par <strong>la</strong> fonction seqPow2.seqPow2 :: Int → [ Int ]seqPow2 x = fnc x [ ]wherefnc k xs | k ≥ 1 = fnc (div k 2) ( [k ] +xs)fnc k xs | k == 0 = xs137

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

Saved successfully!

Ooh no, something went wrong!