remplir une matrice

Librairie C++ de calcul formel/ C++ symbolic computation library

Modérateur : xcasadmin

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

remplir une matrice

Message par cdeval » jeu. juin 23, 2011 8:48 am

Salut Bernard,
j'ai quelques lacunes pour manipuler les vecteurs/matrices avec giac.
Je cherche à transformer une zone de cellules du tableur en une matrice définie par un type gen.
J'arrive à définir ma matrice nulle, c'est pas trop difficile, même s'il y a surement plus élégant que de passer par eval mais bon... :

Code : Tout sélectionner

using namespace std;
using namespace giac;

    int main(){
	std::string s;
	giac::context * contextptr=0;
	gen e;
	s="makemat(0,2,2)";
	gen a(string(s),contextptr);
	e=eval(a,contextptr);
par contre ensuite je ne parviens pas à initialiser des éléments de la matrice, comme je le ferais dans icas : par exemple e[0][0]=1 ne marche pas (même si je mets une variable de type gen à la place de 1)...
A+

parisse
Messages : 5739
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: remplir une matrice

Message par parisse » jeu. juin 23, 2011 9:26 am

Un vecteur est de type vecteur dans giac, c'est en fait un vector<gen>
http://www.cplusplus.com/reference/stl/vector/
Une matrice est un vecteur de lignes, c'est donc un vecteur<gen> dont chaque element est un gen de type _VECT dont le *_VECTptr est le vecteur.
Par exemple pour creer un vecteur de longueur 3
vecteur v(3);
puis par exemple v[0]=1; v[1]=plus_one_half; etc.
ou bien vecteur v=makevecteur(1,plus_one_half,0);
Pour acceder a un element: v[indice]
Pour creer une matrice, par exemple 2 lignes et 3 colonnes
vecteur l1=makevecteur(1,2,3);
vecteur l2=makevcteur(4,5,6);
matrice m=makevecteur(l1,l2);
m[0] est la ligne l1, c'est un gen de type _VECT et *m[0]._VECTptr c'est un vecteur egal a l1 donc (*m[0]._VECTptr)[0] est l'element ligne 0 colonne 0. Tu peux aussi utiliser en lecture seulement la notation m[0][0] (un peu moins efficace mais avec un garde-fou sur le type). Attention en C++ m[0,0] c'est m[0] et pas m[0][0].

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: remplir une matrice

Message par cdeval » jeu. juin 23, 2011 11:49 am

merci ça marche parfaitement, j'arrive à faire ce que je voulais. Il me reste à faire le lien dans mon programme entre une zone de cellules OOo et une matrice giac. Ça ne devrait pas poser de problèmes.
Je posterai ici un exemple d'utilisation de cette nouvelle fonctionnalité (j'ai des idées en proba/stats avec des curseurs...).

Voilà le bout de code, qui peut servir d'exemple à d'autres, au cas ou :

Code : Tout sélectionner

#include <giac/giac.h>

using namespace std;
using namespace giac;

    int main(){
	giac::context * contextptr=0;
	vecteur l1(2);
	vecteur l2(2);
	gen a(string("sqrt(2)"),contextptr);
	l1[0]=1;
	l1[1]=1;
	l2[0]=1;
	l2[1]=a;
	matrice m=makevecteur(l1,l2);
	(*m[0]._VECTptr)[0]=a;
	std::cout << "Résultat : " << m << std::endl;
	std::cout << "m[0][0] : " << m[0][0] << std::endl;
        return 0;
}

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: remplir une matrice

Message par cdeval » ven. juin 24, 2011 7:39 am

salut,
j'ai dû faire quelques ajustements car le nombre de lignes et de colonnes sont contenus dans des variables nlig et ncol. Donc makevecteur ne convient pas pour construire la matrice.
En lisant le code de vecteur.cc, j'ai trouvé un moyen qui fonctionne bien d'après mes tests pour créer ma matrice :

Code : Tout sélectionner

	matrice m; 
	int nlig=2;
	int ncol=3;
	vecteur l(ncol);
	m.reserve(nlig);
	for(i=0;i<nlig;i++)
		m.push_back(l);
vois-tu un inconvénient à précéder ainsi ?

parisse
Messages : 5739
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: remplir une matrice

Message par parisse » ven. juin 24, 2011 7:58 am

Non, chaque ligne sera une copie nouvelle de l zeros.
Par contre, il ne faudrait pas faire gen g(vecteur(ncol)) puis faire des m.push_back(g) car cela mettrait la meme reference de vecteur pour toutes les lignes, ensuite une modification d'un element se repercuterait sur toutes les lignes.

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: remplir une matrice

Message par cdeval » jeu. juin 30, 2011 11:15 pm

ça y est, ça fonctionne.
J'ai créé une petite activité qui met en évidence la possibilité de maintenant passer comme argument une zone de cellules aux fonctions définies par l'utilisateur dans OOo. L'argument est alors converti en variable gen de type matrice.
Si la fonction renvoie une matrice, elle est convertie en zone de cellules dans le tableur (mais ce n'est pas une nouveauté) à condition de valider la formule par Ctrl+Maj+Entrée (convention propre à OpenOffice).
J'ai aussi ajouté les opérations usuelles sur les matrices : addition, multiplication, inverse, puissances, déterminant, ... toutes opérant sur des zones de cellules représentant une matrice.
Je ne crois pas qu'il existe de logiciel formel qui possède ce mode de fonctionnement (une zone de cellules = une matrice). Et je trouve sympathique de pouvoir modifier rapidement les constituants d'une matrice pour voir le résultat des opérations en temps réel. Je vais également réfléchir à un exemple pertinent utilisant les curseurs dans OOo.
Tout cela aura peut-être bientôt un intérêt au lycée puisque les matrices apparaitront probablement dans la spécialité math de TS à la rentrée 2012....

Voilà la petite activité que je vais insérer dans ma documentation :
Pièces jointes
systèmes 3.pdf.zip
(112.14 Kio) Téléchargé 192 fois
systèmes 2.pdf.zip
(133.29 Kio) Téléchargé 185 fois
systèmes 1.pdf.zip
(68.83 Kio) Téléchargé 180 fois

parisse
Messages : 5739
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: remplir une matrice

Message par parisse » ven. juil. 01, 2011 6:49 am

oui, excellente idee, on pourrait appeler ca de l'algebre lineaire dynamique:-)

Répondre