Llamar a una función por una aplicación externa sin abrir una nueva instancia de Matlab

¿Hay alguna manera de llamar a las funciones de Matlab desde afuera, en particular mediante el cmd Windows (pero también el terminal de Linux, las secuencias de comandos de LUA, etc.), SIN abrir una nueva instancia de Matlab cada vez?

por ejemplo en cmd :

 matlab -sd myCurrentDirectory -r "function(parameters)" -nodesktop -nosplash -nojvm 

abre una nueva instancia de Matlab relativamente rápido y ejecuta mi función. La apertura y el cierre de este aviso reducido de matlab demora aproximadamente 2 segundos (sin cálculos), por lo tanto, para 4000 ejecuciones, más de 2 horas. Me gustaría evitar esto, ya que la función llamada siempre se encuentra en el mismo espacio de trabajo. ¿Se puede hacer en la misma instancia siempre?

Ya investigué un poco y encontré la posibilidad del Servidor de Automatización COM de MATLAB , pero me parece bastante complicado y no veo los pasos esenciales para que funcione en mi caso. ¿Algún consejo para eso?

No estoy familiarizado con c/c++/c# pero estoy pensando en el uso de python (pero solo en el peor de los casos).

Basado en la idea no funcional, pero bien pensada, de @Ilya Kobelevskiy aquí la solución final:

  function pipeConnection(numIterations,inputFile) for i=1:numIterations while(exist('inputfile','file')) load inputfile; % read inputfile -> inputdata output = myFunction(inputdata); delete('inputfile'); end % Write output to file % Call external application to process output data % generate new inputfile end; 

Otra solución conveniente sería comstackr un ejecutable de la función Matlab:

 mcc -m myfunction 

ejecuta este .exe -file usando cmd :

 cd myCurrentDirectory && myfunction.exe parameter1 parameter2 

Tenga en cuenta que los parámetros ahora se pasan como cadenas y que el archivo .m original debe ajustarse teniendo en cuenta eso.

más observaciones:

  • Supongo que Matlab aún necesita instalarse en el sistema, aunque no es necesario ejecutarlo.
  • No sé hasta qué punto este método está limitado, respectivamente, la complejidad de la función subyacente.
  • La aceleración en comparación con el enfoque inicial dado en la pregunta es relativamente pequeña

Entre los diversos métodos expuestos aquí, hay una solución que debería reducir el tiempo de ejecución de sus múltiples llamadas de matlab. La idea es ejecutar una función personalizada varias veces dentro de la sesión de Matlab.

Por ejemplo, la función myRand.m se define como

 function r = myRand(a,b) r = a + (ba).*rand; 

Dentro de la ventana de comandos de matlab, generamos el comando de una sola línea como este

 S = [1:5; 1:5; 101:105]; cmd_str = sprintf('B(%d) = myRand(%d,%d);', S) 

Genera el siguiente comando cadena B(1) = myRand(1,101);B(2) = myRand(2,102);B(3) = myRand(3,103);B(4) = myRand(4,104);B(5) = myRand(5,105); que se ejecuta dentro de una sola sesión de matlab con

 matlab -nojvm -nodesktop -nosplash -r "copy_the_command_string_here"; 

Una de las limitaciones es que necesita ejecutar sus llamadas de función 4000 en una fila.

Me gusta el enfoque propuesto por Magla, pero dadas las restricciones que se establecen en su comentario al respecto, puede mejorarse para seguir ejecutando una sola función en una sesión de Matlab.

La idea es canalizar sus entradas y salidas. Para las entradas, puede verificar si existe cierto archivo de entrada, si lo hace, leer la entrada para su función, hacer el trabajo, escribir la salida en otro archivo para señalar los resultados de procesamiento de scripts / funciones que la función de matlab está lista y está esperando el siguiente entrada.

Es muy fácil de implementar el uso de archivos de disco, con un poco de esfuerzo probablemente sea posible a través del disco de memoria (es decir, abrir campos de entrada / salida en la RAM).

 function pipeConnection(numIterations,inputFile,outputFile) for i=1:numIterations while(!isfile(inputFile)) sleep(50); end; % Read inputs output = YourFunction(x,y,z); % Write output to file, go to next iteration end; return; 

Si se desconoce el número de iteraciones al comenzar, también puede codificar las condiciones de salida en el archivo de entrada en lugar de especificar el número de iteraciones de inmediato.

Si está iniciando MATLAB desde la línea de comando con la opción -r en la forma en que describe, entonces siempre comenzará una nueva instancia como usted describe. No creo que haya una forma de evitar esto.

Si llama a MATLAB desde una aplicación C / C ++, MATLAB proporciona la interfaz del motor MATLAB , que se conectaría a cualquier instancia en ejecución de MATLAB.

De lo contrario, la interfaz de MATLAB Automation Server que mencionas es la correcta. Si te resulta complicado, te sugiero publicar una pregunta por separado que detalle lo que has intentado y las dificultades que estás teniendo.

Para completar, mencionaré que MATLAB también tiene una interfaz no documentada que se puede invocar directamente desde Java; sin embargo, dado que no está documentada, es muy difícil hacerlo bien y está sujeta a cambios en todas las versiones, por lo que no debe confiar en ella.


Editar: A partir de R2014b, MATLAB pone a disposición el motor de MATLAB para Python, a través del cual puede automatizar MATLAB desde un script de Python. Y a partir de R2016b, también está el motor de MATLAB para Java. Si alguien antes estaba considerando las técnicas Java no documentadas mencionadas anteriormente, este sería el camino a seguir.