Cours Apl 08
La Réduction
Derrière ce nom mystérieux, se cache une fonctionnalité fort utile.
On l'appelle ainsi car son résultat comporte une dimension de moins que l'objet auquel elle s'applique.
Pas de panique, surtout ne zappez pas !!!
En effet ça semble impressionnant mais c'est juste une question de bon sens.
Illustration : Je veux la somme de ce vecteur : 10 20 30 40
- Première solution : 10 + 20 + 30 + 40
Bien sûr, ça marche, mais c'est un peu laborieux. Et puis il faut connaître tous les éléments du vecteur.
- Deuxième solution : Apl nous offre la réduction. Dans le cas qui nous intéresse, ça consiste à passer d'un vecteur numérique à un scalaire contenant la somme du vecteur.
La syntaxe est la suivante :
+/10 20 30 40 100L'immense avantage de ce procédé est qu'il fonctionne sans que nous ayons besoin de connaître la taille de l'objet à sommer, ni son contenu exact.
Par exemple pour connaître la somme de Vnum1 on écrit simplement : +/Vnum1
Nous venons de constater que nous réduisions effectivement les dimensions, passant d'un vecteur à un scalaire.
Cela fonctionne à l'identique avec une matrice, si ce n'est que nous avons le choix dans le sens de balayage.
Ainsi pour avoir la somme des lignes de Mnum1, nous devons faire une réduction sur la deuxième dimension (balayage horizontal) :
+/[2]Mnum1 100 10 4Apl travaillant implicitement sur la dernière dimension, on aurait simplement pu écrire :
+/Mnum1De plus en plus fort : Collons ce total à droite de Mnum1
Mnum1,+/Mnum1 10 20 30 40 100 1 2 3 4 10 1 1 1 1 4Que s'est-il passé ?
Comme nous l'avons vu précédemment, quand plusieurs fonctions figurent dans la même expression, Apl commence par exécuter le groupe le plus à droite et en passe le résultat à la fonction immédiatement à gauche.
Cette ligne a donc été effectuée en deux temps :
- d'abord +/Mnum1 qui a rendu le vecteur de totaux 100 10 4
- puis Mnum1,(100 10 4) qui a donné le résultat final.
Comment coller à une matrice les totaux dans les 2 sens ?
Dans un premier temps on affecte à Mtot Nnum1 avec ses totaux par lignes :
Mtot„Mnum1,+/Mnum1Ensuite on colle dessous les totaux par colonnes.
Mtot,[1]+/[1]Mtot 10 20 30 40 100 1 2 3 4 10 1 1 1 1 4 12 23 34 45 114Pour vérifier le total général, c'est simple, il suffit de calculer la somme de Mnum1 transformée en vecteur :
+/,Mnum1 114Ici encore, Apl a travaillé en 2 temps :
- Linéariser Mnum1 avec ,Mnum1
10 20 30 40 1 2 3 4 1 1 1 1- Puis en faire la somme par réduction :
+/ 10 20 30 40 1 2 3 4 1 1 1 1Autres exemples :
- connaître le plus grand nombre d'un vecteur :
⌈/3 6 2 12 8- connaître le nombre de voyelles d'une chaîne de caractères :
+/'hello les amis' ∊ 'aeiouy'- est-ce que Mnum1 comporte au moins un nombre supérieur à 5 ?
∨/,Mnum1 > 5- etc ...