/* * Ce fichier MEX (sans CUDA) doit être compilé comme suit: * * /usr/local/math/matlab/matlab-2010a/bin/mex AddMat.c * * Le fichier généré, "AddMat.mexglx", est le programme à exécuter dans MATLAB. * * * Le programme retourne la somme des deux vecteurs (ou matrices) de précision double qui lui sont fournis à l'entrée. * * Pour importer des objets de précision simple, remplacez les "double" par "float" ainsi que "mxDOUBLE_CLASS" (dans la * fonction "mxCreateNumericMatrix") par "mxSINGLE_CLASS". Pour les autres types de données (entiers, signés ou non, etc.), * remplacez "double" par le type désiré et "mxDOUBLE_CLASS" par le type correspondant (voir * http://www.mathworks.com/help/techdoc/apiref/mxcreatenumericmatrix.html pour la liste). */ #include "mex.h" /* * Ci-dessous, la fonction "mexFunction" fait le lien entre le code C et MATLAB; c'est l'équivalent de la fonction "main", pour * un programme s'exécutant sous MATLAB. * * Description courte des arguments de "mexFunction": * nlhs: Nombre d'arguments de sortie fournis à la fonction "AddMat". * *plhs[]: Tableau de pointeurs vers les vecteurs (ou matrices) de sortie passés à la fonction "AddMat". * nrhs: Nombre d'arguments d'entrée fournis à la fonction "AddMat". * *prhs[]: Tableau de pointeurs vers les vecteurs (ou matrices) d'entrée passés à la fonction "AddMat". */ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { unsigned int i, m, n; double *dataIN1, *dataIN2, *dataOUT; if(nrhs != 2) mexErrMsgTxt("Deux arguments (vecteurs ou matrices) doivent être fournis à la fonction.\n"); m = mxGetM(prhs[0]); /* Nombre de rangées de la première matrice d'entrée. */ n = mxGetN(prhs[0]); /* Nombre de colonnes de la première matrice d'entrée.*/ if( (m != mxGetM(prhs[1])) || (n != mxGetN(prhs[1])) ) mexErrMsgTxt("Les deux vecteurs (ou matrices) doivent être de même format.\n"); plhs[0] = mxCreateNumericMatrix(m, n, mxDOUBLE_CLASS, mxREAL); /* On crée ici une matrice de sortie de format m x n */ dataOUT = (double *) mxGetPr(plhs[0]); /* Le pointeur "dataOUT" est maintenant dirigé vers "plhs[0]". */ dataIN1 = (double *) mxGetPr(prhs[0]); /* On s'assure aussi d'associer les pointeurs "dataIN1" et "dataIN2" aux */ dataIN2 = (double *) mxGetPr(prhs[1]); /* matrices d'entrée. */ i = 0; while(i < m*n) /* MATLAB indexe les éléments de matrice avec un seul indice, donc une double boucle */ dataOUT[i] = dataIN1[i] + dataIN2[i], i++; /* n'est pas nécessaire ici. */ }