Bibliothete math en c

Fermé
ryu34 Messages postés 15 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 8 juillet 2005 - 21 juin 2005 à 11:04
 nifnef - 10 août 2005 à 12:23
Salut,

Voila j'aimerais savoir si quelqu'un a une bibliotheque mathematique en c car je dois faire des multiplication de matrice et je dois calculer la pseudo-inverse avec un terme d'optimisation basé sur un critere quadratique. (pour l'éloignement des butées du bras, c un probleme de robotique).
A voir également:

6 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
21 juin 2005 à 11:10
Si tu veux j'ai une class matrice que j'estime assez bien faite. Mais ne contenant pas la pseudo inverse, mais l'inverse par pivot de Gauss.
sinon, essai la bibliothèque gsl.
ftp://ftp.gnu.org/gnu/gsl
(tester sur Win et Linux)
0
ryu34 Messages postés 15 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 8 juillet 2005
21 juin 2005 à 11:52
Ok mais tu peux m'expliquer un peu ce que sont tout ces bibliotheque sur le fichier que tu a laisser en lien car je j'ai pris le dernier mai je sai pas ce qu'il fait et ce que je dois faire avec. (je fai un copier coller et le sauvegarde en .h , c ca)
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
21 juin 2005 à 15:35
deja, tu as quel OS?
tu as telecharger quoi? normalement un fichier compresser.
Tu le decompresse la ou tu veux l'utiliser.
sous Linux, c'est simple tu fait install et make (lit le fichier README ou NSTALL)
sous Win c'est plus compliquer. 2 options
1) Tu te tape toute la compile toi même (en te limitant au bilio qui t'interessent)
2) Tu trouve l'utilitaire pour transformer les makefile Linux en Makefile Win.
Mais avant tou, est tu sur qu'il y a les fonctions que tu veux ?
Si tu veux juste utilisé les opérations simple sur les matrice, je veux bien t'envoyer ma class. Il sagit juste d'un .h à inclure. Son utilisation est relativement simple
bonne chance.
0
ryu34 Messages postés 15 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 8 juillet 2005
23 juin 2005 à 11:42
Voici ma fonction qui permet de calculer la pseudo inverse, le pointeur mat correspond a ma matrice de départ (elle est recu correctement par la fonction), le pointeur inv correspond a la matrice pseudo inversé, N et M sont la taille de la matrice (ou tableau). Le probleme c que je trouve pas les meme résultat que sous Matlab donc si vous voyez une erreur ds l'algo. Merci d'avance car je me doute que pas grand monde connait l'algo d'une pseudo-inverse


# include <math.h>
# include <stdio.h>
int Pseudo(double *Mat,double *Inv,int N,int M)
{
int i,j,i1,i2,k,k1 ;
double xmax,xnul,x,d2 ;
double B[4],C[4],D[4],xnorm[4] ;
double precision = 1e12;

/* Calcul de la norme des vecteurs colonne */
for(i=0 ; i<M ; i++)
{
xnorm[i]=0.0 ;
for(j=0 ; j<N ; j++) xnorm[i] += ( *(Mat+(j*M)+i) ) * ( *(Mat+(j*M)+i) ) ;
}
xmax = xnorm[0] ; /* Recherche de la colonne de norme maximale */

for(i=1 ; i<M ; i++)
if( xnorm[i]>xmax ) xmax = xnorm[i] ;

xnul = xmax/precision ;

/* Initialisation de la Pseudo-inverse */
/* La première ligne de Inv est la première colonne */
/* de Mat divise par sa norme (si non nul) */


if( xnorm[0]>xnul )
for(i=0 ; i<N ; i++) ( *(Inv+i) ) = ( *(Mat+(i*M)) )/xnorm[0] ;
else
for(i=0 ; i<N ; i++) ( *(Inv+i) ) = 0.0 ;


/* Calcul des autres lignes de la Pseudo-inverse */
for(k=1 ; k<M ; k++)
{
k1 = k-1 ; /* indice pour le partitionnement de la matrice */


for(i1=0 ; i1<=k1 ; i1++) /* Calcul de D */
{
D[i1] = 0.0 ;
for(i2=0 ; i2<M ; i2++)
D[i1] += ( *(Inv+(i1*N)+i2) ) * ( *(Mat+(i2*M)+k) ) ;
}


for(i2=0 ; i2<N ; i2++) /* Calcul de C */
{
C[i2] = 0.0 ;
for(i1=0 ; i1<=k1 ; i1++)
C[i2] += ( *(Mat+(i2*M)+i1) ) * D[i1] ;
C[i2] = ( *(Mat+(i2*M)+k) ) - C[i2] ;
}


/* Calcul de la norme de C */
d2 = 0.0 ;
for(i=0 ; i<N ; i++) d2 += C[i]*C[i] ;
if(d2>xnul) /* Si cette norme n'est pas nulle */
for(i=0 ; i<N ; i++)
{
B[i] = C[i]/d2 ;
}
else /* Si cette norme est nulle */
{
d2 = 0.0 ;
for(i=0 ; i<=k1 ; i++)
d2 += D[i]*D[i] ; /* Calcule de la norme de D */
x = d2 + 1.0 ; x= 1.0/x ;


for(i=0 ; i<N ; i++)
{
d2=0.0 ;
for(j=0 ; j<=k1 ; j++) d2 += D[j] * ( *(Inv+(j*N)+i) ) ;
B[i] = x*d2 ;
}
}


for(i=0 ; i<=k1 ; i++)
for(j=0 ; j<N ; j++)
( *(Inv+(i*N)+j) ) -= D[i]*B[j] ;


for(i=0 ; i<N ; i++) ( *(Inv+(k*N)+i) ) = B[i] ;

}
for (i=0;i<12;i++) printf ("%lf\n",*Inv++);
return(1) ; /* C'est fini */
}
0

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

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
23 juin 2005 à 16:51
desoler, je ne connai pas l'Algo.
j'ai jeter un coup d'oeil, j'ai pas vue d'erreur de programmation.
De quel ordre sont les différences avec Matlab? jusqu'à 10% d'erreur, je pense que c'est acceptable.
L'algo de Matlab n'est pas visible? Sinon, il existe Octave qui est un clone de matlab open source. Si la fonction existe sur octave, tu n'as plus qu'à aller voir les sources.
Bonne chance.
0
j'espere que ce n'est pas trop tard, la GSL (gnu scientific library) possede la fonction pinv a priori (il faudrait verifier dans les sources qu'elle calcule la pseudo inverse de moore penrose) equivalente a pinv de matlab...
0