C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Implementation d'une classe Matrix

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Boris Sargos
Guest





PostPosted: Tue May 04, 2004 7:25 am    Post subject: Implementation d'une classe Matrix Reply with quote



Salut à tous,

Bjarne Substroup dans son livre référence, suggère une implémentation d'une
classe Matrix qui utilise la classe slice. C'est donc ce que j'ai fait.
Seulement la fonction membre

Slice_iter Matrix::row(size_t i); // TRES
CONTRAIGNANT

qui mathématiquement retourne le ième vecteur rangée de la matrice, retourne
ici un objet Slice_iter, qui n'est qu'un itérateur sur un valarray. Il
serait souhaitable qu'une telle fonction retourne réellement un vecteur afin
de pouvoir manipuler la ième rangée de la matrice comme un vecteur, en
particulier, qu'il puisse bénéficier des opérations vectorielles (*, +,
;..). Or, je n'ai pas l'intention de développer ces opérateurs pour la
classe Slice_iter, car ce serait très maladroit.
Pourtant, il est nécessaire d'utiliser un tel artifice afin de ne pas
recopier inutilement les données (performance oblige) dans un valarray :

valarray<double> Matrix::row(size_t i); // MALADROIT

Alors, je réfléchis à une solution hybride : une classe Vector qui pourrait
contenir son itérateur :

class Vector {
public:
// Constructeur
Vector(uint size) { v = new valarray<double>(size); s = 0; }
Vector(valarray<double>* vv, slice ss) { v = vv; s = new
slice(ss); }
~Vector() { if(s == 0) delete v; }
// Acces aux éléments
double& operator[] (uint i) { return ref(i); }
private:
valarray<double>* v;
slice* s;
double& ref(uint i) const { if(s == 0) return (*v)[i]; return
(*v)[s->start()+i*s->stride()]; }
}


Je ne sais pas quoi penser de cette implémentation. Un Vector peut donc
avoir deux facettes, selon que son slice soit nul ou pas. C'est surtout le
destructeur qui pose un problème. Ce modèle me semble fragile et dangereux.

J'aimerais avoir votre avis là-dessus.

Merci de m'avoir lu.


Back to top
Gabriel Dos Reis
Guest





PostPosted: Tue May 04, 2004 8:33 am    Post subject: Re: Implementation d'une classe Matrix Reply with quote



"Boris Sargos" <bsargos (AT) wanadoo (DOT) fr> writes:

Quote:
Salut à tous,

Bjarne Substroup dans son livre référence, suggère une implémentation d'une
^^^^^^^^^


Je crois que tu voulais dire Stroustrup.

Quote:
classe Matrix qui utilise la classe slice. C'est donc ce que j'ai fait.
Seulement la fonction membre

Slice_iter Matrix::row(size_t i); // TRES
CONTRAIGNANT

qui mathématiquement retourne le ième vecteur rangée de la matrice, retourne
ici un objet Slice_iter, qui n'est qu'un itérateur sur un valarray. Il

La raison pour laquelle, il a choisi de retourner un Slice_iter est
expliquée page 673:

The Slice_iters are used to circumvent the ban on copying
slice_arrays. I couldn't return a slice_array:

slice_array<double> row(size_t i) { return (*v)[slize(i, d2, d1)]; } // error

so I returned an iterator containing a pointer to the valarray and
the slice itself instead of a slice_array.

Cette restriction de la norme est une erreur comme je l'ai expliquée
dans §2 de « Fixing Valarray for Real World Use » :

http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2000/n1246.ps

Le comité, à l'époque, n'avait pas accordé grand intérêt à la chose. Il
a fallu que Robert Klarer reprennent les mêmes arguments pour que l'erreur
soit enfin corrigée :

http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#253


[ Digression : si tu utilises GCC, tu auras noté qu'à cause d'un bug
dans le compilateur qui ne vérifiait pas les contrôles d'accès
comme il faut, on pouvait retourner les xxx_array par valeur.
GCC-3.4.0 est plus stricte maintenant, et la restriction ci-haut a
aussi été enlevée dans l'implémentation qui vient avec ce
compilateur. ]

Quote:
serait souhaitable qu'une telle fonction retourne réellement un vecteur afin
de pouvoir manipuler la ième rangée de la matrice comme un vecteur, en
particulier, qu'il puisse bénéficier des opérations vectorielles (*, +,
;..). Or, je n'ai pas l'intention de développer ces opérateurs pour la
classe Slice_iter, car ce serait très maladroit.
Pourtant, il est nécessaire d'utiliser un tel artifice afin de ne pas
recopier inutilement les données (performance oblige) dans un valarray :

valarray<double> Matrix::row(size_t i); // MALADROIT

Alors, je réfléchis à une solution hybride : une classe Vector qui pourrait
contenir son itérateur :

class Vector {
public:
// Constructeur
Vector(uint size) { v = new valarray<double>(size); s = 0; }

Hmm, je ne comprends pas ceci.

Quote:
Vector(valarray<double>* vv, slice ss) { v = vv; s = new
slice(ss); }
~Vector() { if(s == 0) delete v; }
// Acces aux éléments
double& operator[] (uint i) { return ref(i); }
private:
valarray<double>* v;
slice* s;
double& ref(uint i) const { if(s == 0) return (*v)[i]; return
(*v)[s->start()+i*s->stride()]; }
}


Je ne sais pas quoi penser de cette implémentation. Un Vector peut donc

Je ne comprends pas trop où tu veux en venir avec cette
implémentation. Est-ce que tu peux essayer de remplacer Slice_iter par
slice_array et voir les problèmes de conception/implémentation que tu as ?

-- Gaby

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.