[LISP] Deux méthodes de remplissage d'une matrice à partir d'un vecteur
par
, 10/05/2019 à 18h15 (1110 Affichages)
Ici une matrice finale de 4x4 depuis un vecteur de 16 éléments. Deux solutions différentes :
- une imbrication de boucles, permettant d'avoir un accès aux deux dimensions de la matrice avec une variable locale incrémentée (pas de 1) ;
- une seule boucle, dont on applique au numéro de l'itération une division euclidienne (quotient et reste forment les deux dimensions de la matrice).
nb : la même matrice est réutilisée, ce qui ne serait probablement pas le cas dans un usage de production (ce qui explique des valeurs très basses, car on y mesure seulement les temps d'accès et d'affectation cellule du vecteur -> cellule de la matrice).
Code lisp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 #!/usr/bin/sbcl --script (defvar original #( 87 139 166 249 95 108 185 163 62 218 158 164 20 210 129 251 ) ) (defvar matrice (make-array '(4 4) :initial-element 0 ) ) (defun remplir-matrice-4x4 (matrice vecteur) (let ( (i 0) ) (dotimes (n 4) (dotimes (m 4) (setf (aref matrice n m) (aref vecteur i) ) (setf i (1+ i)) ) ) matrice ) ) (defun remplir-matrice-4x4-modulo (matrice vecteur) (dotimes (i 16) (multiple-value-bind (n m) (floor i 4) (setf (aref matrice n m) (aref vecteur i) ) ) ) matrice ) (print (remplir-matrice-4x4 matrice original) ) (time (dotimes (n 1000000) (remplir-matrice-4x4 matrice original) )) (print (remplir-matrice-4x4-modulo matrice original) ) (time (dotimes (n 1000000) (remplir-matrice-4x4-modulo matrice original) ))
Les deux résultats sont sensiblement les mêmes depuis ma console...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #2A((87 139 166 249) (95 108 185 163) (62 218 158 164) (20 210 129 251)) Evaluation took: 0.159 seconds of real time 0.159265 seconds of total run time (0.159107 user, 0.000158 system) 100.00% CPU 351,662,692 processor cycles 0 bytes consed #2A((87 139 166 249) (95 108 185 163) (62 218 158 164) (20 210 129 251)) Evaluation took: 0.156 seconds of real time 0.155932 seconds of total run time (0.155926 user, 0.000006 system) 100.00% CPU 344,295,288 processor cycles 0 bytes consed