Utilisation de MEX

cs_nomadstorm Messages postés 18 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 15 mai 2011 - 3 mai 2011 à 17:47
axelorque Messages postés 10 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 4 juillet 2011 - 5 mai 2011 à 14:26
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.

#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 
# include 

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 
# include 

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);
}
}

1 réponse

axelorque Messages postés 10 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 4 juillet 2011
5 mai 2011 à 14:26
faut compiler le programme C avant de l'exécuter sous matlab non?
0
Rejoignez-nous