Class matrice

Résolu
alonsyl Messages postés 348 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 6 novembre 2008 - 3 déc. 2004 à 09:22
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 - 10 déc. 2004 à 09:31
bonjour,

je travaille sur vb6 et j'essaie d'apprendre a utiliser les modules de class.
je doit faire du calcul matriciel alors j'essaie de creer une class definissant mes matrices.
j'arrive a creer les propriete 'nblignes' et 'nbcols' mais c'est apeu pres tout.

pour commencer, je ne sais pas comment faire pour que lorsque un element soit instancie 'as new matrice', il soit definit comme un double tableau (ie, s'il est de class matrice c'est un double tableau).

je doit aussi calculer les determinants, transpose et les inverses de mes matrices. je suppose que le determinant et une 'proprietee' et qu'il se calcul dans un module de class ?!

quant est il des transposes et inverses ? est-ce que ce sont des proprietes de ma matrice principale ou est-que je doit appliquer une methode a cette meme matrice principale ?

please help me !!

merci a vous,

alonsyl

10 réponses

alonsyl Messages postés 348 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 6 novembre 2008 12
8 déc. 2004 à 15:30
bonjour,

puisque ca ne te derange pas, je continue a te poser des questions (je vais aller encore un peu plus loing).

pour commencer, ce que tu m'as explique ce matin fonctionne tres bien !

maintenant, je voudrais multiplier deux objets de type matrice entre eux.

pour cela, dois-je effectuer une simple procedure sub multiplier() dans mon module principal ou y a t'il moyen de creer une methode qui fasse se travail ?
(je cherche la solution la plus efficace et pas a creer et manipuler des objets a tous prix)

merci a toi,

alonsyl
3
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
10 déc. 2004 à 09:31
Le pluis simple est sans doute de faire une focntion recevant deux objet matrice en argument et retournant une matrice conetnant le résultat du produits des deux matrices argument.
Tu peux aussi faire une fonction dans la classe Matrice qui prendra UNE matrice en argument et renverra une amtrice qui sera le produit de l'instance matrice courante par LA matrice argument.
Dans un cas comme dans l'autre, la problematique est exactement le meme !
VB ne permettant pas de surcharger les opérateurs, comme en C/C++, je ferait la seconde version personnellement

Christophe R.
3
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
3 déc. 2004 à 13:29
Voici un squelette de classe "Matrice"
private pMat() as long
private pNbCol as Long
private pNbLigne as Long

Public Property Get NbLigne() as Long
NbLigne = pNbLigne
End Property

Public Property Get NbCol() as Long
NbCol = pNbCol
End Property

Public sub Init(NbCol as long,NbLigne as Long)
pNbCol = NbCol
pNbLigne = NbLigne
Redim pMat(1 To NbCol,1 To NbLigne)
End Sub

Public Function Transpose() As Matrice
' Code pour transposer une matrice
End Function

Public Function Inverse() As Matrice
' Code pour inverser une matrice
End Function


Après avoir instancier un objet Matrice comme ceci : "Dim M As New Matrice"
Il faut appeler la méthode "Init()" dessus pour dimensionner ton tableau : "M.Init 10, 10" par exemple.
Tu pourras ensuite appeler les méthode "M.Transpose()" et "M.Inverse()" qui te renverrons la matrice transposer ou inverser

Si tu a besoin de plus d'info sur les classes, je suis disponible ...

Christophe R.
0
alonsyl Messages postés 348 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 6 novembre 2008 12
5 déc. 2004 à 20:34
salut christophe,

j'ai tout plein de questions sur les class !!! (=> j'ai pas compris grand chose...)

tout d'abord, voici mon code truffe d'erreurs:

<=voici mon module principal (plutot simplet)=>
Dim cnx As New ADODB.Connection
Dim rst As New ADODB.Recordset
Sub Main()
cnx.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Left(App.Path, Len(App.Path)) & "\matrice.mdb;Jet OLEDB:Database Password=pass;"
cnx.Open
rst.Open "SELECT count(y) as somme FROM matrice;", cnx
Dim matryss As New matrice
MsgBox matryss.NbLignes
MsgBox matryss.NbCols
cnx.Close
End Sub

<=pour mon module de class, j'ai mis a peu pres ce que tu m'as indique=>
'Public pMat() As Long
Public pNbLignes As Long
Public pNbCols As Long
Public Property Get NbLignes() As Long
NbLignes = pNbLignes
End Property
Public Property Get NbCols() As Long
NbCols = pNbCols
End Property
Public Class_Initialize(NbLignes, NbCols)
pNbLignes = NbLignes
pNbCols = NbCols
ReDim pMat(1 To NbCols, 1 To NbLignes)
End Property
Public Function Transpose() As matrice
End Function
Public Function Inverse() As matrice
End Function

voici toutes mes questions:
1) je ne sais pas comment faire pour que Class_Initialize(param1, param2) recoive param1=rst(0) et param2=rst(0)/2
2) est-il normal que NbLignes et NbCols ne soient aucunement declares comme Public ?
3) j'ai neutralise la premiere ligne du module de classe car il refuse de la compiler (je crois que c'est parce que ce tableau n'est pas declare avec une valeur fixe). est-ce grave ?
4) meme en regardant attentivement Class_Initialize(param1, param2), je ne vois pas pourqoui matryss est archirtecture de la meme maniere que pMat(1 To NbCols, 1 To NbLignes).

merci pour ton aide,

sylvain
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
6 déc. 2004 à 09:44
1- ce type de déclaration " Class_Initialize(param1, param2)" n'est pas possible en VB6, contrairement au C !! Tu ne peux pas modifier le constructeur de la classe qui ne peut prendre aucun argumlent ! C'est pour cette raison que j'ai fait une méthode Init() qui doit être appeler juste après la création de l'instance !
2- Pour faire une propriété, tu as deux solutions : Tu déclare une variable "Public NbLigne As Long" dans ta classe : C'est la méthod e la plus simple mais tu n'as alors aucun moyen de t'assurer que la valeur est correcte (>0 par exemple)
Ou bien comme je l'ai fait, tu déclares une variable "Private pNbLigne As Long" (le petit 'p' devant le nom permet de se rappeler qu'il s'agit d'un membre privé de la classe, et ce n'est qu'une convention d'écriture) Puis tu déclare deux sub de type "Public Property Get NbLigne" et "Public Property Let NbLigne" Tu peux ne mettre que la "Property Get NbLigne" si tu veux une propriété en lecture seule : C'est le cas pour mon NbLigne qui est définit par la méthode "Init()"
3- Chez moi, la ligne "private pMat() as long" compile très bien !! Tu as quoi comme msg d'erreur ?
4- Comprend pas ta question ?????

Christophe R.
0
alonsyl Messages postés 348 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 6 novembre 2008 12
6 déc. 2004 à 15:00
en realite la question 4 m'interesse tout particulierement alors je vais essayer de mieux me faire comprendre:

je desire que matryss as new matrice soit un objet ayant l'ossature d'un tableau de nblignes lignes et nbcols colonnes.

comme j'ai vu que tu cree a l'initialisation de la class le tableau pMat(1 To NbCols, 1 To NbLignes), j'ai cru que c'etait lui qui creer l'architecture expliquee ci-dessus a tous les objets de type matrice (un tableau de nblignes lignes et nbcols colonnes).

si c'est le cas, je ne vois ou il a ete specifie que tous les objets de type matrice auraient la structure de pMat.
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
6 déc. 2004 à 17:52
En tete de classe, il y a cette ligne "private pMat() as long"
C'est elle qui fait que chaque objet de type "Matrice" stocke un tableau de Long dont la taille est définit par l'appel de la méthode "Init()" sur l'instance de cet objet.
Chaque instance d'une classe hérite de tous les éléments Private ou Public qui sont déclaré dans la classe.
Donc le code suivant ...

Dim M1 as New Matrice
Dim M2 as New Matrice
M1.Init(10,10)
M2.Init(8,5)

... provoque la création :
Ligne 1 : d'une isntance M1 de la classe Matrice
Ligne 2 : d'une isntance M2 de la classe Matrice
Ligne 3 : d'un tableau de long de 10x10 en tant que membre privé de M1
Ligne 4 : d'un tableau de long de 8x5 en tant que membre privé de M2

Et ca roule !!!

Christophe R.
0
alonsyl Messages postés 348 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 6 novembre 2008 12
8 déc. 2004 à 11:21
bonjour,

promis, ceci est ma toute derniere question !

maintenant, je suis dans mon prog principal et mon module de class est celui que tu m'as donne:

Sub Main()
Dim matryss As New matrice
'la je cherche a remplir ma matrice
End Sub
Plutot succinct !!!

ma question est de savoir comment est-ce que tu fais pour remplir cette satanee matrice ?

merci a toi,

alonsyl
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
8 déc. 2004 à 12:18
Il va falloir ajouter à la classe matrice de cquoi remplir son pMat().
De façon primaire on peut ajouter cela à la classe
Public Sub SetValue(L as long, C As Long, Valeur as Long)
pMat(C,L) = Valeur
End Sub 
' Et cela pour relire la matrice bien sur ...
Public function GetValue(L As Long, C As Long) As Long
GetValue = pMat(C,L)
End Function


Il faudra ajouter dans ce code des tests pour être sûr que les paramêtre L et C sont compris entre 1 et pNbLigne et pNbCol, bien sûr, mais je t'en laisse le soin.
Ensuite tu pourras faire :
Dim i as long, j as long
Matryss.Init(10,10)
For i = 1 to 10
For j = 1 to 10
Matryss.SetValue(i,j,0)
Next 
Next

Pour initialiser une matrice à zéro par exemple.
Bon amusement.
Christophe R.
0
alonsyl Messages postés 348 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 6 novembre 2008 12
10 déc. 2004 à 09:30
bonjour,

encore une nouvelle question !

voici ma methode transpose() dans mon module de class:
Public Function Transpose()
ReDim pMat(1 To pNbCol, 1 To pNbLigne)
ReDim pMatranspo(1 To pNbLigne, 1 To pNbCol)
For i = 1 To pNbCol
For j = 1 To pNbLigne
pMatranspo(j, i) = pMat(i, j)
Next
Next
Transpose = pMatranspo
End Function

voici mon module principal:
Sub Main()
Dim matryss As New matrice
matryss.NbLigne = 8
matryss.NbCol = 12
MsgBox matryss.NbLigne & " lignes et " & matryss.NbCol & " colonnes."
matryss_transp = matryss.Transpose
End Sub

tout fonctionne tres bien sauf que 'matryss_transp' est un simple tableau sans etre de class matrice. j'ai deja essaye: Public Function Transpose() As matrice, mais ca plante completement !

comment faire pour que 'matryss_transp' soit de type matrice ?

merci a toi,

alonsyl
0
Rejoignez-nous