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
nifnef - 10 août 2005 à 12:23
A voir également:
- Bibliothete math en c
- Formule math - Télécharger - Études & Formations
- Photo math - Télécharger - Études & Formations
- Tux of math - Télécharger - Bureautique
- Sine qua non math - Télécharger - Calcul & Conversion
- Kwik math - Télécharger - Études & Formations
6 réponses
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
21 juin 2005 à 11:10
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)
sinon, essai la bibliothèque gsl.
ftp://ftp.gnu.org/gnu/gsl
(tester sur Win et Linux)
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
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)
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
21 juin 2005 à 15:35
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.
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.
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
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 */
}
# 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 */
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
23 juin 2005 à 16:51
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.
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.