Rechercher : dans
Par :

Bibliothete math en c

Dernière réponse le 10 aoû 2005 à 12:23:05 ryu34, le 21 jun 2005 à 11:04:26 
 Signaler ce message aux modérateurs

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).

Meilleures réponses pour « Bibliothete math en c » dans :
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Javascript - L'objet Math VoirLes particularités de l'objet Math L'objet Math est, comme vous l'imaginez, un objet qui a de nombreuses méthodes et propriétés permettant de manipuler des nombres et qui contient des fonctions mathématiques courantes. Quelque soit la méthode ou la...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...

1

Char Snipeur, le 21 jun 2005 à 11:10:27

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) Salutation !
Char Snipeur

Répondre à Char Snipeur

2

ryu34, le 21 jun 2005 à 11:52:17

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)

Répondre à ryu34

3

Char Snipeur, le 21 jun 2005 à 15:35:23

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. Salutation !
Char Snipeur

Répondre à Char Snipeur

4

ryu34, le 23 jun 2005 à 11:42:45

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 */
}

Répondre à ryu34

5

Char Snipeur, le 23 jun 2005 à 16:51:18

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. Salutation !
Char Snipeur

Répondre à Char Snipeur

6

 nifnef, le 10 aoû 2005 à 12:23:05

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...

Répondre à nifnef