Sous-sections

6.8 Interface C

Utilisation de programme en C avec Matlab (interface mex)

Type de données
matrice (ou Matlab array) en C type mxArray , qui contiens le type, les dimensions MxN (M nbre de lignes et N nbre de colonnes), les données, ...
stocage
les données sont stockées par colonne dans un seul vecteur. Les valeurs sont des réels en double précision (double en C)
gestion mémoire
gestion dynamique avec les 2 fonctions
  1. mxArray * mxCreateDoubleMatrix(int M, int N, mxReal); // creation
  2. void mxDestroyArray(mxArray *); // destruction

6.8.1 mxArray structure matrice

  1. int mxGetM(mxArray *) ; // nbre de lignes
  2. int mxGetN(mxArray *) ; // nbre de colonnes
  3. double * mxGetPr(mxArray *); // pointeur vers les donnees
  4. double mxGetScalar(mxArray *); // 1ere valeur

6.8.2 Appel d'une fonction C

matlab
[D,E]=func(A,B,C);
dans un fichier func.c , création d'une interface C avec Matlab contenant une fonction

void mexFunction(int nlhs, mxArray *plhs[ ], int nrhs, const mxArray *prhs[ ]);

nlhs
= nbre de variables calculées (résultats) dans le membre de gauche LHS sous matlab (ici 2: D et E)
plhs[
] = tableau de pointeurs donnant les structures mxArray associées (plhs[0]->D, plhs[1]->E): ces matrices doivent être créent par le programme !!!!
nrhs
= nbre de variables arguments (données) dans le membre de droite RHS sous matlab (ici 3: A,B,C)
prhs[
] = tableau de pointeurs donnant les structures mxArray associées (prhs[0]->A, prhs[1]->B, prhs[2]->C).

6.8.3 Structure d'un fichier mex


\begin{lstlisting}
...

6.8.4 Example: prodmat.c

Matlab
B=prodmat(A,X);
Fonction C


\begin{lstlisting}
/* B=prodmat(A,X) i.e. B=A.X */
void ProdMat(double *A,double...
...[i]=0;
for(j=0; j<N; j++) B[i] += A[i+N*j]*X[j];
}
return;
}
\end{lstlisting}

Interface Matlab


\begin{lstlisting}
...

6.8.5 Compilation

compilation
mex prodmat.c
fichier objet
prodmat.mexglx
MATLAB
C=prodmat(A,B);
REM:
appel de fonctions MATLAB en C
mexCallMATLAB
appel de la fonction func matalb
mexCallMATLAB(int nlhs, mxArray *plhs[ ], int nrhs, const mxArray *prhs[ ], “func”);


Pr. Marc BUFFAT
marc.buffat@univ-lyon1.fr
2007-02-08