Red de conocimiento informático - Conocimiento informático - Cómo conectar matlab con mex y C con ejemplos PDF

Cómo conectar matlab con mex y C con ejemplos PDF

Si tengo una función escrita en lenguaje C que implementa una función, como una función simple:

doble suma(doble x, doble y)

{ return x y; }

Ahora quiero usarlo en Matlab, como input:

gt; a = add(1.1, 2.2)

3.3000

Para obtener los resultados anteriores ¿qué se debe hacer?

Una solución es utilizar archivos MEX. Los archivos MEX hacen que llamar a funciones de C sea tan conveniente como llamar a las funciones integradas de Matlab. Los archivos MEX se compilan a partir del código C original más funciones de interfaz dedicadas a los archivos MEX. Se puede entender que el archivo MEX implementa una interfaz, que transfiere las variables independientes ingresadas al llamar a la función en Matlab a la función C a través de una interfaz específica, y el resultado se transfiere nuevamente a Matlab a través de la interfaz. El funcionamiento de esta interfaz específica está incluido en la función mexFunction y es configurado específicamente por el usuario.

Entonces ahora tenemos que escribir un archivo C que contenga add y mexFunction. Matlab llama a la función y pasa las variables independientes en la función (como 1.1 y 2.2 en el ejemplo anterior) a un parámetro de mexFunction. mexFunction pasa el valor para agregar y el resultado se devuelve a otro parámetro de mexFunction. Matlab usa este parámetro para proporcionar el valor de salida cuando se llama a la función en la declaración de Matlab (como en el ejemplo anterior).

Vale la pena señalar que el archivo mex está relacionado con la plataforma. Según tengo entendido, el archivo mex es una biblioteca de enlaces dinámicos alternativa. Usando la opción mex -v en matlab6.5, puede ver información similar a la siguiente en la etapa final de mex:

--gt; "del _lib94902.obj"

- - gt; "del "test.exp""

--gt; "del "test.lib""

En otras palabras, aunque el archivo dll se genera en matlab6. 5, pero de hecho hay un archivo lib generado en el medio.

Por ejemplo, el archivo C se ha escrito y se llama add.c. Luego, en Matlab, ingrese:

gt; mex add.c

para compilar add.c en un archivo MEX (use el comando mex -setup para configurar el compilador) , en Windows, el tipo de archivo MEX es mexw32, es decir, ahora obtenemos el archivo add.mexw32. Ahora, podemos llamar al archivo MEX tal como llamamos a la función M, como en el ejemplo mencionado anteriormente. Por lo tanto, al usar archivos MEX, usar funciones C es lo mismo que usar funciones M.

Hablemos ahora de cómo escribir mexFunction.

La definición de mexFunction es:

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

{

}

Como puede ver, mexFunction no tiene valor de retorno. No transfiere el resultado a Matlab a través del valor de retorno, sino a través de la asignación del parámetro plhs.

Los cuatro parámetros de mexFunction describen la información específica cuando Matlab llama al archivo MEX, como cuando se llama a la función de esta manera:

gt; b = 1.1; p>gt ;gt; a = add(b, c)

El significado de los cuatro parámetros de mexFunction es:

nlhs = 1, lo que indica que el lado izquierdo (lhs -lado izquierdo) de la declaración de llamada tiene una variable, es decir, a.

nrhs = 2, lo que indica que hay dos variables independientes en el lado derecho (lado derecho) de la declaración de llamada, a saber, b y c.

plhs es un array cuyo contenido es un puntero, que apunta al tipo de datos mxArray. Debido a que solo hay una variable en el lado izquierdo, es decir, la matriz tiene solo un puntero y el resultado señalado por plhs [0] se asignará a a.

prhs es similar a plhs, porque hay dos variables independientes en el lado derecho, es decir, la matriz tiene dos punteros, prhs[0] apunta a by prhs[1] apunta a c . Cabe señalar que prhs es una matriz de puntero constante, es decir, el contenido al que apunta no se puede cambiar.

Debido a que la unidad más básica de Matlab es la matriz, no importa de qué tipo sea, como matriz doble, matriz de celdas, matriz de estructuras... entonces a, b, c son todas matrices y b = 1.1 Un arreglo doble 1x1. En lenguaje C, la matriz de Matlab está representada por el tipo mxArray. Por lo tanto, no es difícil entender por qué plhs y prhs son matrices de punteros que apuntan al tipo mxArray.

El add.c completo es el siguiente:

#include "mex.h" // Usa el archivo de encabezado que debe incluirse en el archivo MEX

//Realizar una función C de trabajo específico

double add(double x, double y)

{

return x y;

}

//Función de interfaz de archivo MEX

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

{

doble *a;

doble b, c;

plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL

a = mxGetPr( plhs[0]);

b = *(mxGetPr(prhs[0]));

c = *(mxGetPr(prhs[1])) ;

*a = add(b, c);

}

¿Qué significa el contenido de mexFunction? Sabemos que si la función se llama así:

gt; gt; salida = add(1.1, 2.2);

El valor de la salida es desconocido cuando no se trata de ningún cálculo específico. , no está asignado. Entonces, en el programa específico, creamos una matriz doble real 1x1 (usando la función mxCreateDoubleMatrix, que devuelve un puntero al mxArray recién creado), y luego dejamos que plhs[0] apunte a ella. Luego, deje que el puntero apunte al primer elemento de mxArray señalado por plhs [0] (use la función mxGetPr para devolver un puntero al primer elemento de mxArray).

De manera similar, sacamos los elementos señalados por prhs[0] y prhs[1] (es decir, 1.1 y 2.2) y los asignamos a b y c. Entonces podemos pasar b y c como variables independientes a la función agregar, y el resultado se asigna al elemento en mxArray al que apunta el puntero a. Debido a que a apunta al elemento de mxArray señalado por plhs[0], cuando se realiza la salida final, el mxArray señalado por plhs[0] se asigna a la salida, y la salida es el resultado calculado.

Los principiantes definitivamente se marearán debido a los muchos consejos mencionados anteriormente sobre mxArray. Lo sentimos, la única manera de descubrir estas relaciones confusas es leer más y practicar más.

De hecho, mexFunction no es tan simple. Necesitamos probar el número y el tipo de variables independientes de entrada del usuario para asegurarnos de que la entrada sea correcta. Por ejemplo, en el ejemplo de la función agregar, es un error que el usuario ingrese una matriz de caracteres.

De la descripción anterior, concluimos que el archivo MEX implementa una interfaz para devolver adecuadamente los resultados del cálculo en lenguaje C a Matlab. Cuando ya tenemos un programa grande escrito en C, no necesitamos reescribirlo en Matlab. Simplemente podemos escribir una interfaz y convertirla en un archivo MEX. Además, algunos cuellos de botella de cálculo en el programa Matlab (como los bucles) se pueden implementar en lenguaje C a través de archivos MEX para mejorar la velocidad de cálculo.

Lo anterior es una comprensión preliminar de los archivos mex. La siguiente es una introducción detallada sobre cómo escribir archivos mex en lenguaje C:

1 ¿Por qué deberíamos escribir archivos MEX en lenguaje C? ?

MATLAB es un lenguaje matricial, diseñado para operaciones vectoriales y matriciales. En términos generales, si la operación se puede implementar con vectores o matrices, su velocidad de operación es muy rápida. Pero si la operación implica mucho procesamiento de bucles, la velocidad de MATLAB será insoportable. Una solución es escribirlo como un archivo MEX cuando deba usar un bucle for para que MATLAB no tenga que interpretar las declaraciones en el bucle cada vez que las ejecute.

2 Instalación y configuración del compilador

Para utilizar el compilador MATLAB se debe instalar en el ordenador del usuario cualquiera de los siguientes compiladores ANSI C/C que estén preinstalados y adaptados a MATLAB :

MicroSoft Visual C (MSVC) versión 5.0, 6.0

Borland C versión 5.0, 5.2, 5.3, 5.4, 5.5

LCC (traído por MATLAB, solo se puede utilizar para generar archivos MEX)

Los siguientes son los pasos para instalar y configurar los ajustes de la aplicación compiladora MEX de MATLAB:

(1) Ejecute mex en el comando MATLAB ventana – configuración, aparece el siguiente mensaje:

Elija su compilador para crear archivos de interfaz externa (MEX):

¿Le gustaría que mex localice los compiladores instalados [sí]/n?

(2) Seleccione y, MATLAB buscará automáticamente el tipo, la versión y la ruta del compilador externo instalado en la computadora y los enumerará para que el usuario los elija:

Seleccione un compilador:

[1] Borland C Builder versión 6.0 en C:\Program Files\Borland

[2] Digital Visual Fortran versión 6.0 en C:\Program Files\Microsoft Visual Studio

[3] Lcc C versión 2.4 en D:\MATLAB6P5P1\sys\lcc

[4] Microsoft Visual C/C versión 6.0 en C:\Program Files\Microsoft Visual Studio

[0] Ninguno

Compilador:

(3) Seleccione uno de ellos (aquí se selecciona 3), MATLAB le pide al usuario que confirme:

Verifique sus opciones:

Compilador: Lcc C 2.4

Ubicación: D:\MATLAB6P5P1\sys\lcc

¿Son correctas? ?([y]/ n):

(4) Seleccione y para finalizar la configuración del compilador MATLAB.

3 Un ejemplo simple de archivo MEX

El ejemplo 1 usa un archivo m para crear una matriz de Hilbert de 1000×1000.

tic

m=1000;

n=1000

a=zeros(m,n);

para i=1:1000

para j=1:1000

a(i, j)=1/(i j

fin);

end

toc

Crea un nuevo archivo Matlab_1.cpp en matlab e ingresa el siguiente programa:

#include "mex. h "

//Proceso de cálculo

void hilb(double *y, int n)

{

int i, j;

for(i=0; i

for(j=0; j

*(y j i*n)=1/((doble)i ( double )j 1);

}

//Proceso de interfaz

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

{

doble x, *y;

int n;

if (nrhs!=1)< / p>

mexErrMsgTxt("Se requiere una entrada.");

if (nlhs != 1)

mexErrMsgTxt("Se requiere una salida.");

if (!mxIsDouble(prhs[0])||mxGetN(prhs[0])*mxGetM(prhs[0])!=1)

mexErrMsgTxt("La entrada debe ser escalares. " );

x=mxGetScalar(prhs[0]);

plhs[0]=mxCreateDoubleMatrix(x, x, mxREAL);

n= mxGetM (plhs[0]);

y=mxGetPr(plhs[0]);

hilb(y, n);

}

Este programa es un programa en lenguaje C, que también implementa la función de establecer una matriz de Hilbert. Ingrese el siguiente comando en la ventana de comandos de MATLAB: mex Matlab_1.cpp y la compilación será exitosa. Ingrese a la carpeta y encontrará dos archivos más: Matlab_1.asv y Matlab_1.dll, donde Matlab_1.dll es el archivo MEX. Ejecute el siguiente programa:

tic

a=Matlab_1(1000);

toc

elapsed_time =

0.0470

Como se puede ver en lo anterior, los archivos MEX con las mismas funciones son mucho más rápidos que los archivos m.

4 Composición y parámetros de los archivos MEX

El código fuente de los archivos MEX generalmente consta de dos partes:

(1) Proceso de cálculo. Este proceso contiene el código del archivo MEX para implementar la función de cálculo, que es una subrutina estándar en lenguaje C.

(2) Proceso de ingreso.

Este proceso proporciona la interfaz entre el proceso de cálculo y MATLAB, que se implementa con la función de entrada mxFunction. En este proceso lo que se suele hacer es comprobar la exactitud del número y tipo de parámetros de entrada y salida, y luego utilizar la función mx para obtener las variables pasadas por MATLAB (como las dimensiones de la matriz, la dirección de el vector, etc.) y pasarlos al proceso de cálculo.

El proceso de cálculo y el proceso de entrada del archivo MEX también se pueden fusionar. Pero en cualquier caso, se debe incluir #include "mex.h" para garantizar que el punto de entrada y el procedimiento de interfaz se declaren correctamente. Tenga en cuenta que el nombre del proceso de entrada debe ser mexFunction y contener cuatro parámetros, a saber:

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

Entre ellos, los parámetros nlhs y nrhs representan el número de variables en los extremos izquierdo y derecho de la ecuación cuando MATLAB llama al archivo MEX. Por ejemplo, ingrese el siguiente comando en la ventana de comandos de MATLAB:

[a, b, c]=Matlab_1(d, e, f, g)

Entonces nlhs es 3 y nrhs es 4.

Cuando MATLAB llama a un archivo MEX, los parámetros de entrada y salida se almacenan en dos matrices de punteros de tipo mxArray*, que son prhs[] y plhs[] respectivamente. prhs[0] representa el primer parámetro de entrada, prhs[1] representa el segundo parámetro de entrada,..., y así sucesivamente. Como en el ejemplo anterior, d→prhs[0], e→prhs[1], f→prhs[2], f→prhs[3]. Tenga en cuenta también que los tipos de estos parámetros son mxArray *.

El proceso de interfaz necesita pasar parámetros al proceso de cálculo y también necesita leer la información de la matriz de prhs, lo que requiere las siguientes funciones mx y mex.

5 funciones mex y funciones mx de uso común

En la versión 6.5 de MATLAB, hay 106 funciones mx y 38 funciones mex. A continuación solo presentamos las funciones de uso común.

5.1 Función de entrada mexFunction

Esta función es la función de entrada del archivo C MEX y su formato es fijo:

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

Nota: El método de llamada de las funciones de MATLAB es generalmente: [a, b, c, ...] = nombre de la función llamada (d, e, f,...), nlhs guarda el número de parámetros de salida en el lado izquierdo del signo igual, y la matriz de punteros plhs guarda específicamente la dirección de cada parámetro en el lado izquierdo del signo igual. Tenga en cuenta que mxArray. la memoria objetivo de cada elemento de plhs no se asigna y debe asignarse durante el proceso de interfaz; la memoria prhs guarda el número de parámetros de entrada en el lado derecho del signo igual. La matriz de punteros prhs guarda específicamente la dirección de cada parámetro. el lado derecho del signo igual. Tenga en cuenta que cuando MATLAB llama al archivo MEX, cada parámetro de entrada ya existe, por lo que no es necesario durante el proceso de interfaz. Luego, asigne memoria para estos parámetros.