Algorithme produit matriciel CAML

Discutez d'informatique ici !
jonses
Membre Relatif
Messages: 496
Enregistré le: 19 Mai 2013, 11:33

algorithme produit matriciel CAML

par jonses » 24 Avr 2014, 19:38

Bonjour,

J'essaye d'écrire un algorithme calculant le produit de deux matrices. Je pensais que ma fonction marchait (et j'ai même comparé avec des fonctions trouvées sur le net!), mais elle me renvoie un résultat erroné.

Je n'arrive pas du tout à trouver le problème, si quelqu'un peut m'aider, ou me donner quelques indications svp.


--
Les matrices sont pour cette fonction représentées par le type int vect vect

par exemple [| [|1;2|];[|0;0|] |] représente la matrice

Voici mon programme :

(*produit matricielle v2*v1 *)

let prod v1 v2 =
let n=vect_length v1 in (*n=nombre de ligne de v1=nombre de colonne de v2*)
let l=vect_length v2 in (*l=nombre de ligne de v2*)
let c=vect_length v1.(0) in (*c=nombre de colonne de v1*)
let m=make_vect l (make_vect c 0) in (*m est la matrice nulle à l ligne et c colonne*)
for i= 0 to (l-1) do
for j= 0 to (c-1) do
for k=0 to (n-1) do
m.(i).(j)<- (m.(i).(j) + v2.(i).(k)*v1.(k).(j))
done;
done;
done;
m;;


Lorsque j'essaie cette fonction pour calculer [| [|1;2|]; [|0;0|] |] x [| [|1;1|];[|1;1|] |]

elle me renvoie [| [|3;3|];[|3;3|] |] au lieu de [| [|3;3|];[|0;0|] |] !!!

Du coup je ne trouve pas mon erreur, j'ai pourtant cherché, et j'ai même comparé avec d'autres programmes sur le net, mais je n'y arrive pas..

Si quelqu'un peut m'aider svp
Je vous remercie d'avance pour vos réponses



L.A.
Membre Irrationnel
Messages: 1709
Enregistré le: 09 Aoû 2008, 18:21

par L.A. » 24 Avr 2014, 21:21

jonses a écrit:let prod v1 v2 =
let n=vect_length v1 in (*n=nombre de ligne de v1=nombre de colonne de v2*)
let l=vect_length v2 in (*l=nombre de ligne de v2*)
let c=vect_length v1.(0) in (*c=nombre de colonne de v1*)
let m=make_vect l (make_vect c 0) in (*m est la matrice nulle à l ligne et c colonne*)
for i= 0 to (l-1) do
for j= 0 to (c-1) do
for k=0 to (n-1) do
m.(i).(j)<- (m.(i).(j) + v2.(i).(k)*v1.(k).(j))
done;
done;
done;
m;;


Bonsoir.

Je crois que deux "make_vect" ne peuvent pas remplacer un "make_matrix" (sinon, pour une raison qui m'échappe totalement, toutes les lignes de la matrice créée renvoient à un seul et même vecteur, ce qui explique que tu obtiens une matrice avec deux fois la même ligne).

Essaye d'utiliser "make_matrix l c 0".

jonses
Membre Relatif
Messages: 496
Enregistré le: 19 Mai 2013, 11:33

par jonses » 24 Avr 2014, 21:32

J'ai changé et... ça marche !!

Merci beaucoup !


Mais je suis quand même étonné que c'est juste à cause de ce "make_vect".

L.A.
Membre Irrationnel
Messages: 1709
Enregistré le: 09 Aoû 2008, 18:21

par L.A. » 24 Avr 2014, 22:34

Oui, c'est étrange mais il suffit de le savoir et d'éviter de tomber dans le piège (j'y suis tombé plus d'une fois).

Autre piège du même genre : si v est un vecteur et que tu utilises "let w = v" puis que tu modifies w, alors v sera aussi modifié. Pour éviter ça il faut écrire "let w = copy_vect v".

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite