Hay ejemplos de cómo conectar matlab con mex usando C
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 entrada:
>> 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 las 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:
--> "del _lib94902.obj"
-- > "del "test.exp""
--> "del "test.lib""
En otras palabras, aunque el archivo dll se genera en matlab6.5, el medio De hecho, se generó un archivo lib.
Por ejemplo, el archivo C se ha escrito y se llama add.c. Luego, en Matlab, ingrese:
>> mex add.c
para compilar add.c en un archivo MEX (use el comando mex -setup para configurar el compilador). 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, a través de 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:
>> b = 1.1;
>> a = add(b, c)
El significado de los cuatro parámetros de mexFunction es:
nlhs = 1, lo que indica que hay una variable en el lado izquierdo ( lado izquierdo) de la declaración de llamada, 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] ));
p>*a = agregar(b, c);
}