jueves, 27 de octubre de 2011

Partes esenciales de un archivo MEX

Todos los archivos MEX que se requieren para enlazar código escrito en C y código de MATLAB contienen componentes necesarios para su correcto funcionamiento.

Dentro de éstos se incluyen; una librería "mex.h" que contiene las funciones de la API del sistema operativo, una función llamada "mexFunction" que permite realizar funciones de gateway, un arreglo llamado "mxArray" y funciones propias de la API.

La librería mex.h se incluye en las declaraciones del código tal como se muestra a continuación:

#include <stdio.h>
#include <stdlib.h>
#include "mex.h"

Luego se declara la función principal del código por medio de mexFunction, y se utilizan cuatro parámetros básicos, tal como se muestra a continuación:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
código
}

Los parámetros se describen en la siguiente tabla:

mexFunction Name of the gateway routine (same for every MEX-file)
nlhs Number of expected mxArrays (Left Hand Side)
plhs Array of pointers to expected outputs
nrhs Number of inputs (Right Hand Side)
prhs Array of pointers to input data. The input data is read-only and should not be altered by your mexFunction .

Por otra parte mxArray permite trabajar con distintos tipos de datos en forma estructurada, y es la forma en cómo los datos del código en C se comunican con los datos del código propio de MATLAB.

Finalmente, las funciones usadas, propias de la API que estan en la librería mex.h, se caracterizan por tener como prefijo la palabra mex, sin embargo tienen la misma funcionalidad que el lenguaje C. Por ejemplo la función printf() del lenguaje C equivale a la función mexprintf() de las funciones de esta interfaz.



Ejemplo de Programa en C portado a Matlab

1. Necesitamos el programa desarrolado en c, con la siguiente libreria y cabecera:

#include "mex.h"
/* mexFunction es la rutina de enlace con el código C. */
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
/*Codigo*/
}

2. Guardar el archivo .c en la carpeta de trabajo de matlab
3. Para compilar el codigo utilizar el siguiente comando:


>> mex -v -g archivo.c

4. Matlab nos genera un archivo .mexw32, quese guarda automaticamente en la carpeta de trabajo de matlab, este archivo lo llamamos como una funcion desde la ventana de comandos o desde un script de matlab

>> archivo

Desarrolo del ejemplo:


Código en C:


#include <stdio.h>
#include <stdlib.h>
#include "mex.h"

/* mexFunction es la rutina de enlace con el código C. */
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
 double a, b, suma,resta, multiplicacion,division;
a=2;
b=3;
mexPrintf ("valor de a:%g \n",a);
mexPrintf ("valor de b:%g \n\n",b);
suma=a+b;
resta=a-b;
multiplicacion=a*b;
division=a/b;

mexPrintf ("Valor de suma:%g\n",suma);
mexPrintf ("Valor de resta:%g\n",resta);
mexPrintf ("Valor de multiplicacion:%g\n",multiplicacion);
mexPrintf ("Valor de division:%g\n",division);

/*return EXIT_SUCCESS;*/
}


Guardamos el archivos en la carpeta MATLAB


Compilación desde la ventana de comandos de matlab



Se crea el archivo  suma.mexw32



Ejecutamos como una función






miércoles, 26 de octubre de 2011

Configurar el compilador a utilizar

1. Mediante el comandmex -setup elegir el tipo de compilador a utilizar

>> mex -setup
Please choose your compiler for building external interface (MEX) files: 


2. Aceptamos que el computador busque los compiladores instalados con y

 Would you like mex to locate installed compilers [y]/n? y

 3. Seleccionamos un compilador de la lista y aceptamos

Select a compiler:
[1] Lcc-win32 C 2.4.1 in C:\PROGRA~1\MATLAB\R2009a\sys\lcc
[2] Microsoft Visual C++ 2008 SP1 in C:\Program Files\Microsoft Visual Studio 9.0

[0] None

Compiler: 1

Please verify your choices:

Compiler: Lcc-win32 C 2.4.1
Location: C:\PROGRA~1\MATLAB\R2009a\sys\lcc

Are these correct [y]/n? y

Trying to update options file: C:\Users\PAMR\AppData\Roaming\MathWorks\MATLAB\R2009a\mexopts.bat
From template:              C:\PROGRA~1\MATLAB\R2009a\bin\win32\mexopts\lccopts.bat

Done . . .

**************************************************************************
  Warning: The MATLAB C and Fortran API has changed to support MATLAB
           variables with more than 2^32-1 elements.  In the near future
           you will be required to update your code to utilize the new
           API. You can find more information about this at:
           http://www.mathworks.com/support/solutions/data/1-5C27B9.html?solution=1-5C27B9
           Building with the -largeArrayDims option enables the new API.
**************************************************************************