2011-07-27 14 views
7

Estoy usando un archivo MEX de Matlab para importar algunos resultados de simulación en Matlab (¡sin código fuente disponible, por supuesto!). La interfaz con Matlab es en realidad muy simple, ya que hay una sola función, que devuelve una estructura de Matlab. Me gustaría saber si hay alguna forma de llamar a esta función en el archivo MEX directamente desde Python, sin tener que usar Matlab.Incrustar una función desde un archivo MEX de Matlab directamente en Python

Lo que tengo en mente es, por ejemplo, usar algo como SWIG para importar la función C a Python, proporcionando un envoltorio Matlab personalizado a su alrededor ... Por cierto, sé que con scipy.io.loadmat ya es posible leer los archivos de datos de Matlab binary * .mat, pero no sé si la representación de datos en un archivo mat es la misma que la representación interna en Matlab (en cuyo caso podría ser útil para el contenedor MEX).

La idea sería, por supuesto, poder utilizar la función proporcionada en el MEX sin la instalación de Matlab presente en el sistema.

Gracias.

Respuesta

2

A menos que esté malinterpretando algo sobre cómo funciona Matlab o sobre su pregunta, es muy poco probable que sea posible. Desde un punto de vista técnico, cualquier solución necesitaría ser un error binario completo, compatible con binarios, característica para la reimplementación de características de la biblioteca Matlab C, (implementando mxGetPr, mxGetN, etc.) pero vinculante para Python.

Déjenme editar mi propia respuesta para decir lo siguiente: Si usted tiene una licencia de MATLAB disponible, existe el excelente paquete MLAB wrap que hace al menos parte de lo que desea.

+0

¿Pero la biblioteca Matlab C ya no está vinculada en el archivo MEX? ¿O no podría incluirse en el contenedor? Por supuesto, supongo que en este caso Matlab está instalado en el sistema ... – OlivierB

+0

Lo que dices puede ser posible, pero no es lo que inicialmente pediste. En ese caso, necesitaría una licencia de Matlab y podría ejecutar tantas sesiones del archivo MEX como licencias de Matlab, incluso si lo hace desde Python. Aún así, sería técnicamente difícil vincular la biblioteca de Matlab C a Python. – carlosdc

+0

Además, no soy abogado y no he leído el EULA de Matlab, pero hacerlo podría ser de dudosa legalidad. – carlosdc

1
  1. Se puede construir una biblioteca de un archivo mex como Mauro señaló
  2. Puede utilizar scipy.io.loadmat con seguridad, la representación de datos:

de:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html

Devoluciones:

mat_dict: dict

diccionario con los nombres de variables como llaves, y las matrices cargadas como valores

Las matrices son cargados a medida que los guardó, es decir, la representación de datos debe ser coherente.

1

Una función mex es una API que permite a Matlab (es decir, un programa matlab) llamar a una función escrita en c/C++. Esta función, a su vez, puede llamar a Matlab a funciones internas propias. Como tal, la función mex se vinculará con las bibliotecas de Matlab. Por lo tanto, llamar a una función mex directamente desde un programa Python sin bibliotecas Matlab no parece posible (y no tiene sentido para el caso).

De consideración, ¿por qué se creó la función mex en primer lugar?¿Hubo que poner a disposición de los usuarios de matlab algunas librerías no matlab (o código c), o fue para ocultar algún código de matlab de propiedad mientras se seguía poniendo a disposición de los usuarios de matlab? Si es el primer caso, puede solicitar a los propietarios de la función mex que lo proporcionen en un formato de lib dinámico no mexicano que pueda incluir en otro programa c o python. Esto debería ser fácil si la función mex no depende de las funciones internas de Matlab.

Otros anteriores han mencionado el compilador de matlab ... sí, puede incluir una función mex en un binario independiente que se puede llamar desde Unix (por lo tanto de python pero como una llamada de Unix) si utiliza el compilador Matlab para producir dicho binario . Esto requeriría que el binario se desplegara junto con el entorno de tiempo de ejecución de Matlab. Esto no es lo mismo que llamar a una función directamente desde python, no hay valores devueltos, por ejemplo.

Cuestiones relacionadas