Voir le flux RSS

nothus

[LISP] Deux méthodes de remplissage d'une matrice à partir d'un vecteur

Noter ce billet
par , 10/05/2019 à 18h15 (179 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

Envoyer le billet « [LISP] Deux méthodes de remplissage d'une matrice à partir d'un vecteur » dans le blog Viadeo Envoyer le billet « [LISP] Deux méthodes de remplissage d'une matrice à partir d'un vecteur » dans le blog Twitter Envoyer le billet « [LISP] Deux méthodes de remplissage d'une matrice à partir d'un vecteur » dans le blog Google Envoyer le billet « [LISP] Deux méthodes de remplissage d'une matrice à partir d'un vecteur » dans le blog Facebook Envoyer le billet « [LISP] Deux méthodes de remplissage d'une matrice à partir d'un vecteur » dans le blog Digg Envoyer le billet « [LISP] Deux méthodes de remplissage d'une matrice à partir d'un vecteur » dans le blog Delicious Envoyer le billet « [LISP] Deux méthodes de remplissage d'une matrice à partir d'un vecteur » dans le blog MySpace Envoyer le billet « [LISP] Deux méthodes de remplissage d'une matrice à partir d'un vecteur » dans le blog Yahoo

Commentaires