begin process at 2012 05 30 10:34:18
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Divers

 > 

Utilisation de MEX


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Utilisation de MEX

mardi 3 mai 2011 à 17:47:26 | Utilisation de MEX

nomadstorm

Bonjour,


J'ai un programme en C qui fonctionne et je voudrais le faire fonctionner sous MatLab afin de pouvoir traiter immédiatement et rapidement des données.

J'ai essayé la syntaxe suivante,et dans Matlab,en tapant mex CENTRE.C, il m'affiche:
C:\PROGRA~1\MATLAB\R2008A\BIN\MEX.PL: Error: 'COSENO.C' not found.

??? Error using ==> mex at 207
Unable to complete successfully.

Où je dois mettre le fichier CENTRE.C.et est ce qu'il y a d'autres changements à faire dans le programme.

Code C/C++ :
#include "mex.h"
 
void mexFunction( int nlhs, mxArray *plhs[],
        int nrhs, const mxArray *prhs[]) {
 
 


# include <math.h>
# include <conio.h>
# include <stdlib.h>
# include <stdio.h>
# include <alloc.h>
# include <io.h>

float disco  (char fichero[], int nfil, int ncol, int control,
	char huge *a, int tipo);

void ordena ( float huge *mod, long huge *orden, long int nd );

void main(void)

{
	 char arch[30],arch0[30],arch1[30],archi[30];
	 float huge *i;
	 float huge *i1;
	 float huge *masque;
	 long  huge *qq;
	 float pi, th, sumpos, sumneg, delta;
	 int dim, j;
	 long n2, n1, cont=0;
	 long int p1, p2, p3, p4;


/*pi=3.141592654;*/
	 

	 clrscr();
	 gotoxy(2,2);
	 printf(" dimension du fichier: ");
	 scanf("%d",&dim);
	 gotoxy(2,4);
	 n2=(long)dim * (long)dim ;

	 p1 = 0L; p2 = (long)(dim/2);
	 p3 = (long)dim* p2;
	 p4 = p3 + p2;

	i=farcalloc((unsigned)n2,4);
	i1=farcalloc((unsigned)n2,4);
	masque=farcalloc((unsigned)n2,4);
	qq=farcalloc(n2,sizeof(long int));


	if ( i== NULL || i1== NULL || qq==NULL || masque==NULL){
	printf ( "\n\a\a no hay memoria ");
	goto fin;
	}


bik:
	 clrscr();
	gotoxy(2,4);
	printf("  la valeur seuille th:  ");
	scanf("%f",&th);
	clrscr();


        gotoxy(2,8);
        printf(" donner le nom de la phase a analyser: ");
        scanf("%s",&arch0);
        j=disco(arch0,dim,dim,1,(char*)i,4);
        if(j!=1) goto fin;

        gotoxy(2,10);
        printf(" donner l'amplitude de l'objet a discriminer: ");
        scanf("%s",&arch1);
        j=disco(arch1,dim,dim,1,(char*)i1,4);
        if(j!=1) goto fin;

	gotoxy(2,12);
	printf(" donner le nom du masque optimal: ");
	scanf("%s",&archi);


	for( n1=0; n1<n2; n1++ ){
	   i1[n1] *= (float)cos( (double)i[n1] );
	   masque[n1] = 1;
	}
	masque[p1] = masque[p2] = masque[p3] = masque[p4] = 0;
	i1[p1] = i1[p2] = i1[p3] = i1[p4] = 0;

	ordena ( i1, qq, n2 );

	n1=0; sumpos = sumneg = 0;
	while (i1[ qq[n1] ] >0) {
	  sumpos += i1[ qq[n1] ];
	  n1++;
	}
	for(; n1<n2; n1++)  sumneg += i1[ qq[n1] ];

	delta = sumpos + sumneg;

	if( delta < 0  && fabs((double)delta) > th ) {
	   n1=n2-1;
	   while ( delta < 0  && fabs((double)delta) > th ){
	      masque[ qq[n1] ] = 0;
	      delta -= i1[ qq[n1] ];
	      n1--; cont++;
	      delta -= i1[ qq[n1] ];
	      n1--; cont++;
	   }
	} else if ( delta > th ){
	   n1=0;
	   while ( delta > th ){
	      masque[ qq[n1] ] = 0;
	      delta -= i1[ qq[n1] ];
	      n1++; cont++;
	      delta -= i1[ qq[n1] ];
	      n1++; cont++;
	   }
	}

	clrscr();
	gotoxy(10, 10);
	printf("Number of blocked pixels = %ld,   %f",
				   cont+4L, (float)(cont+4L)/(float)n2);
	gotoxy(10, 14);
	printf("threshold = %f,     delta = %f", th, delta);

	 j=disco(archi,dim,dim,2,(char*)masque,4);
	 if(j!=1) goto fin;


fin:
	      farfree((void far*)i);
	      farfree((void far *)i1);
	      farfree((void far *)masque);
	      farfree((void far *)qq);
}



/***************************************************/
/*                  ORDENA                         */
/*   classés du plus grand au plus petit des éléments*/
/*   vecteur mod[]. L'ordre des éléments*/
/*   donnée dans la matrice orden[]. orden[0] nous donne*/
/*   élément m maximum, orden[1] ce qui suit, ...   */
/*   orden[nd-1] l'élément m de petites*/
/***************************************************/
void ordena ( float huge *mod, long huge *orden, long int nd )
{
   long kac, kfin, k, k1, o, p, p1;

   kfin = nd-1;
   do {
      k = -1;  kac = 0;  k1  = 0;
      do {
         k++; k1++;
         if ( mod[ orden[k] ] < mod[ orden[k1] ] ){
           o = orden[k]; orden[k]  = orden[k1];  orden[k1] = o;
           kac = k1; p = k; p1 = k-1;
           while ( p1>0 ) {
              if( mod[orden[p]] > mod[orden[p1]] ){
                 o = orden[p]; orden[p]  = orden[p1];  orden[p1] = o;
                 p--; p1--;
              } else p1 =0;
           };
         }
      } while ( k1 < kfin );
      kfin = kac; printf("\n %ld", kfin);
   } while ( kfin > 1 );
}

 /*********************************************************************\
 *                                                                     *
 *                                                                     *
 *                            DISCO.C                                  *
 *                            =======                                  *
 *                                                                     *
 *         Numéros, le transfert de routine de tout type de*
 *         mémoire variable sur un disque ou un disque*
 *         à une variable de la mémoire.                               *
 *                                                                     *
 *                          ---------                                  *
 *                                                                     *
 *      Paramètre:                                                    *
 *                                                                     *
 *      fichero         -  Nom du fichier disque.               *
 *      nfil, ncol      -  Nombre de lignes et de colonnes.                 *
 *      control         -  1 pour lire le fichier.                    *
 *                         2 d'enregistrer dans le fichier.                *
 *      a               -  pointeur vers une variable.             *
 *      tipo            -  nombre d'octets par élément variable.    *
 *                                                                     *
 *                                                                     *
 \*********************************************************************/


float disco  (char fichero[], int nfil, int ncol, int control,
	char huge *a, int tipo)

{
        long int n, cont, ng;
        int unidad, j, cociente, resto;

        if (control == 1)  {
                if ((unidad = open (fichero,1))  == -1)  {
                        return (-1);
                }
                cont = (long) nfil * (long) ncol * tipo;
                resto = cont % 32768;
                cociente = cont / 32768;
                for (j = 0, n = 0; j < cociente; j++,n += 32768)
                        _read (unidad, (char*)&a[n], 32768);
                _read (unidad, (char*)&a[n], resto);
                close (unidad);
                return (1);
        }
        if (control == 2)  {
                if ((unidad = creat (fichero, 200))  == -1)  {
                        return (-1);
                }
                cont = (long) nfil * (long) ncol * tipo;
                resto = cont % 32768;
                cociente = cont / 32768;
                ng = 0;
                for (j = 0, n = 0; j < cociente; j++, n += 32768)
                     ng = ng + (unsigned) _write (unidad, (char*)&a[n], 32768);
                ng = ng + (unsigned) _write (unidad, (char*)&a[n], resto);
                if (ng != cont)   {
                        return (0);
                }

                close (unidad);
                return (1);
        }
        return (0);
}
}[code=cpp]#include "mex.h"
 
void mexFunction( int nlhs, mxArray *plhs[],
        int nrhs, const mxArray *prhs[]) {
 
 


# include <math.h>
# include <conio.h>
# include <stdlib.h>
# include <stdio.h>
# include <alloc.h>
# include <io.h>

float disco  (char fichero[], int nfil, int ncol, int control,
	char huge *a, int tipo);

void ordena ( float huge *mod, long huge *orden, long int nd );

void main(void)

{
	 char arch[30],arch0[30],arch1[30],archi[30];
	 float huge *i;
	 float huge *i1;
	 float huge *masque;
	 long  huge *qq;
	 float pi, th, sumpos, sumneg, delta;
	 int dim, j;
	 long n2, n1, cont=0;
	 long int p1, p2, p3, p4;


/*pi=3.141592654;*/
	 

	 clrscr();
	 gotoxy(2,2);
	 printf(" dimension du fichier: ");
	 scanf("%d",&dim);
	 gotoxy(2,4);
	 n2=(long)dim * (long)dim ;

	 p1 = 0L; p2 = (long)(dim/2);
	 p3 = (long)dim* p2;
	 p4 = p3 + p2;

	i=farcalloc((unsigned)n2,4);
	i1=farcalloc((unsigned)n2,4);
	masque=farcalloc((unsigned)n2,4);
	qq=farcalloc(n2,sizeof(long int));


	if ( i== NULL || i1== NULL || qq==NULL || masque==NULL){
	printf ( "\n\a\a no hay memoria ");
	goto fin;
	}


bik:
	 clrscr();
	gotoxy(2,4);
	printf("  la valeur seuille th:  ");
	scanf("%f",&th);
	clrscr();


        gotoxy(2,8);
        printf(" donner le nom de la phase a analyser: ");
        scanf("%s",&arch0);
        j=disco(arch0,dim,dim,1,(char*)i,4);
        if(j!=1) goto fin;

        gotoxy(2,10);
        printf(" donner l'amplitude de l'objet a discriminer: ");
        scanf("%s",&arch1);
        j=disco(arch1,dim,dim,1,(char*)i1,4);
        if(j!=1) goto fin;

	gotoxy(2,12);
	printf(" donner le nom du masque optimal: ");
	scanf("%s",&archi);


	for( n1=0; n1<n2; n1++ ){
	   i1[n1] *= (float)cos( (double)i[n1] );
	   masque[n1] = 1;
	}
	masque[p1] = masque[p2] = masque[p3] = masque[p4] = 0;
	i1[p1] = i1[p2] = i1[p3] = i1[p4] = 0;

	ordena ( i1, qq, n2 );

	n1=0; sumpos = sumneg = 0;
	while (i1[ qq[n1] ] >0) {
	  sumpos += i1[ qq[n1] ];
	  n1++;
	}
	for(; n1<n2; n1++)  sumneg += i1[ qq[n1] ];

	delta = sumpos + sumneg;

	if( delta < 0  && fabs((double)delta) > th ) {
	   n1=n2-1;
	   while ( delta < 0  && fabs((double)delta) > th ){
	      masque[ qq[n1] ] = 0;
	      delta -= i1[ qq[n1] ];
	      n1--; cont++;
	      delta -= i1[ qq[n1] ];
	      n1--; cont++;
	   }
	} else if ( delta > th ){
	   n1=0;
	   while ( delta > th ){
	      masque[ qq[n1] ] = 0;
	      delta -= i1[ qq[n1] ];
	      n1++; cont++;
	      delta -= i1[ qq[n1] ];
	      n1++; cont++;
	   }
	}

	clrscr();
	gotoxy(10, 10);
	printf("Number of blocked pixels = %ld,   %f",
				   cont+4L, (float)(cont+4L)/(float)n2);
	gotoxy(10, 14);
	printf("threshold = %f,     delta = %f", th, delta);

	 j=disco(archi,dim,dim,2,(char*)masque,4);
	 if(j!=1) goto fin;


fin:
	      farfree((void far*)i);
	      farfree((void far *)i1);
	      farfree((void far *)masque);
	      farfree((void far *)qq);
}



/***************************************************/
/*                  ORDENA                         */
/*   classés du plus grand au plus petit des éléments*/
/*   vecteur mod[]. L'ordre des éléments*/
/*   donnée dans la matrice orden[]. orden[0] nous donne*/
/*   élément m maximum, orden[1] ce qui suit, ...   */
/*   orden[nd-1] l'élément m de petites*/
/***************************************************/
void ordena ( float huge *mod, long huge *orden, long int nd )
{
   long kac, kfin, k, k1, o, p, p1;

   kfin = nd-1;
   do {
      k = -1;  kac = 0;  k1  = 0;
      do {
         k++; k1++;
         if ( mod[ orden[k] ] < mod[ orden[k1] ] ){
           o = orden[k]; orden[k]  = orden[k1];  orden[k1] = o;
           kac = k1; p = k; p1 = k-1;
           while ( p1>0 ) {
              if( mod[orden[p]] > mod[orden[p1]] ){
                 o = orden[p]; orden[p]  = orden[p1];  orden[p1] = o;
                 p--; p1--;
              } else p1 =0;
           };
         }
      } while ( k1 < kfin );
      kfin = kac; printf("\n %ld", kfin);
   } while ( kfin > 1 );
}

 /*********************************************************************\
 *                                                                     *
 *                                                                     *
 *                            DISCO.C                                  *
 *                            =======                                  *
 *                                                                     *
 *         Numéros, le transfert de routine de tout type de*
 *         mémoire variable sur un disque ou un disque*
 *         à une variable de la mémoire.                               *
 *                                                                     *
 *                          ---------                                  *
 *                                                                     *
 *      Paramètre:                                                    *
 *                                                                     *
 *      fichero         -  Nom du fichier disque.               *
 *      nfil, ncol      -  Nombre de lignes et de colonnes.                 *
 *      control         -  1 pour lire le fichier.                    *
 *                         2 d'enregistrer dans le fichier.                *
 *      a               -  pointeur vers une variable.             *
 *      tipo            -  nombre d'octets par élément variable.    *
 *                                                                     *
 *                                                                     *
 \*********************************************************************/


float disco  (char fichero[], int nfil, int ncol, int control,
	char huge *a, int tipo)

{
        long int n, cont, ng;
        int unidad, j, cociente, resto;

        if (control == 1)  {
                if ((unidad = open (fichero,1))  == -1)  {
                        return (-1);
                }
                cont = (long) nfil * (long) ncol * tipo;
                resto = cont % 32768;
                cociente = cont / 32768;
                for (j = 0, n = 0; j < cociente; j++,n += 32768)
                        _read (unidad, (char*)&a[n], 32768);
                _read (unidad, (char*)&a[n], resto);
                close (unidad);
                return (1);
        }
        if (control == 2)  {
                if ((unidad = creat (fichero, 200))  == -1)  {
                        return (-1);
                }
                cont = (long) nfil * (long) ncol * tipo;
                resto = cont % 32768;
                cociente = cont / 32768;
                ng = 0;
                for (j = 0, n = 0; j < cociente; j++, n += 32768)
                     ng = ng + (unsigned) _write (unidad, (char*)&a[n], 32768);
                ng = ng + (unsigned) _write (unidad, (char*)&a[n], resto);
                if (ng != cont)   {
                        return (0);
                }

                close (unidad);
                return (1);
        }
        return (0);
}
}
jeudi 5 mai 2011 à 14:26:26 | Re : Utilisation de MEX

axelorque

faut compiler le programme C avant de l'exécuter sous matlab non?


Cette discussion est classée dans : long, int, cont, n1, orden


Répondre à ce message

Sujets en rapport avec ce message

type de variable? long int ? [ par dleewax ] salut! je suis nouveau dans le C++ et j'ai un petit problème... je suis en train de faire un petit programme permettant de calculer les factorielles.. conversion constante en hexa ->unsigned long ou int ??? [ par andrealphus ] 4ndr&@lphu$rebonjour à tous et toutes,mon nouveau probleme est ridicule mais gênant...comment peut on convertir un nombre hexadécimal (du style l'adre Traduire long int en tableau de caracteres [ par Shyron ] Salut,Je cherche comment traduire un long int en un tableau de caracteres de même taille que le nombre de chiffres du long int en C++. probleme avec printf(%d) [ par jeani763 ] Mon probleme est assez compliqué :Je voudrais que mon programme compte le nombre de lettres que je lui donne ce qui ce fait grace a la fonction cin ; SHBrowseForFolder [ par grandmach ] Bonjour,J'essaie d'afficher une fenetre de séléction de répertoire avec SHBrowseForFolder mais je n'arrive pas à changer le titre de la fenetre (dans Problème d'interfacage d'une DLL écrite en C++ avec vba [ par pierrinot ] Bonjour, Je dois créer une DLL utilisable par un programme VBA. Je tombe sur un problème d'entête de fonctions. La DLL est bien compilée, mais lorsq problème Win32 Api [ par Toadstool ] J'ai Visual C++ 6 Introductory Edition et j'ai programmé une classe censée représenter une fenetre mais quand dans le constructeur de la classe j'ecri Bitwise... [ par MeltedMind ] Wise ou not wise là est la question.Je me demandais... sur le fonctionnement primaire de nos petites machines. 1+ 1 = 10, c'est bien connu mais comme compatibilité borland microsoft visual [ par swnnos ] Bonjour je dois réutiliser un fichier d'en tête fourni par le constructeur d'une platine d'usinage. Seulement ce fichier est compatible borland mais p calcul en précision étendue [ par JesusQuintana ] Bonjours, Je veux programmer en C un ensemble complet de fonctions pour additionner, multiplier des nombres en précision étendue. Les no


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,359 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales