Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Caml
Caml Forum d'entraide sur la programmation avec les langages fonctionnels Caml-Light et OCaml
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/06/2012, 16h26   #1
trylam
Invité de passage
 
Femme
Étudiant
Inscription : juin 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 6
Points : 1
Points : 1
Par défaut Les vecteurs creux

Bonjour,

Des vecteurs creux sont des vecteurs de grande taille avec beaucoup de coordonnées nulles. Par exemple V = (0, 0, 3.1, 0, 0, 4.2, 0, 0, 0, 0). On ne veut stocker que les infos non nulles, donc ici 3.1 et 4.2 ainsi que leur position.

Il fallait definir un type vectcreu, j'ai donc fait :
Code :
1
2
3
type couple ={place : int; composante:float}
type vectcreu = {taille :int; position : couple list}
Maintenant le problème c'est que je dois calculer la norme (sqrt(somme(coordonnées²))).
J'ai fait :
Code :
1
2
3
4
5
let rec calc l =
     match l with
     |[] -> 0.0
     |(i, v)::t -> sqrt (v*.v+.calc t);;
Et ensuite :
Code :
1
2
3
let norme v=
     calc v.position;;
Cela ne fonctionne pas mais je ne vois pas pourquoi (je débute...).

Merci pour votre aide.
trylam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2012, 18h56   #2
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
Dans ta fonction récursive, tu utilises les éléments comme des couples `int * float`, ce qui est incompatible avec la définition de type que tu donnes. Il faut que tu choisisses soit d'utiliser des couples ainsi, soit d'utiliser le type `couple` que tu as défini.

Pour manipuler un type produit comme le type `couple` que tu as défini, tu peux utiliser
Code :
| c :: t -> ... c.place ... c.composante ...
ou bien
Code :
| { place = i; composante = v } :: t -> .... i ... v ....
Par ailleurs l'algorithme utilisé est faux, puisque tu prends la racine récursivement: si tu as une liste [(i1,v1); (i2,v2); (i3,v3)] tu vas calculer sqrt(v1^2 + sqrt(v2^2 + sqrt(v^3 + 0))), ce qui est faux.
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2012, 19h20   #3
trylam
Invité de passage
 
Femme
Étudiant
Inscription : juin 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 6
Points : 1
Points : 1
Ca marche! Merci.

Finalement j'ai fait :

Code :
1
2
3
4
5
let rec somme l =
   match l with
   |[] -> 0.0
   |{ place = i; composante = v } :: t -> v*.v+.somme t;;
puis :

Code :
1
2
3
let norme v=
   sqrt (somme v.position);;
trylam est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h30.


 
 
 
 
Partenaires

Hébergement Web