Problème de vitesse d'execution d'un code C
Bonjour à tous,
J'ai interfacé un code C avec Matlab, pour augmenter la vitesse d’exécution de Matlab. Mon souci c'est que lorsque j’exécute mon code C (compilé avec gcc) il met 10 secondes environs mais lorsque j’exécute ce même programme sous Matlab il met plus de 5 minutes.
J'ai l’impression que la fonction mex de matlab n'optimise pas bien mon code et de plus j'ai le warning suivant :
Est ce normale ou c'est moi qui est mal codé quelque chose ?
Voici un exemple sur la manière dont je m'y prend pour faire l'interface :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include "mex.h"
#include <stdio.h>
#include <stdlib.h>
typedef int Bool;
#define False 0
#define True 1
/*#######################************ Programme C copie d'une matrice ***********************####################*/
void copie(double **x,double **res, unsigned int row, unsigned int col)
{
register unsigned int i1,j1;
for(i1=0;i1<row;++i1)
{
for(j1=0;j1<col;++j1)
{
res[i1][j1]=x[i1][j1];
}
}
}
/* nrhs nombre de parametre d'entre
nlhs nombre de parametre de sortie
prhs tableau de pointeur d'un element en entre
plhs tableau de pointeur de sortie
*/
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) {
double *x,*res, **I;
double **Icopie;
unsigned int nrow, ncol;
register unsigned int i, j;
nrow = mxGetM(prhs[0]);
ncol = mxGetN(prhs[0]);
x = mxGetPr(prhs[0]);
I = mxMalloc(nrow * sizeof(double *));
/* changement de representation en memoire des matrices matlab */
for (i = 0; i < nrow; ++i)
{ I[i] = mxMalloc(ncol * sizeof(double)); }
for(i=0;i<nrow;++i){
for(j=0;j<ncol;++j)
{I[i][j] = x[j*nrow+i];}}
Icopie = mxMalloc(nrow * sizeof(double *));
for (i = 0; i < nrow; ++i)
{ Icopie[i] = mxMalloc(ncol * sizeof(double)); }
plhs[0] = mxCreateDoubleMatrix(nrow, ncol, mxREAL);
res= mxGetPr(plhs[0]);
/* appel de la fonction C */
copie(I,Icopie,nrow,ncol) ;
/*resultat */
for(j=0;j<ncol;++j){
for(i=0;i<nrow;++i)
{res[j*nrow+i]=Icopie[i][j];}}
} |