通过外部应用程序调用一个函数,而无需打开一个新的Matlab实例

有没有办法从外部调用Matlab函数,特别是通过Windows cmd (也包括Linuxterminal,LUA脚本等),而不是每次都打开Matlab的新实例?

例如在cmd

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

打开一个Matlab的新实例相对较快,并执行我的function。 打开和closures这个简化的matlab提示大约需要2秒钟(没有计算) – 因此4000次执行超过2小时。 我想避免这一点,因为被调用的函数总是位于同一个工作区。 总是可以在同一个实例中完成吗?

我已经做了一些研究,发现了MATLAB COM自动化服务器的可能性,但是对我来说似乎相当复杂,而且我没有看到使它适用于我的情况的基本步骤。 任何build议呢?

我不熟悉c/c++/c#但我正在考虑使用python (但在最坏的情况下)。

基于@Ilya Kobelevskiy的非工作但深思熟虑的想法,最后的解决方法是:

  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; 

另一个方便的解决scheme是编译Matlab函数的可执行文件:

 mcc -m myfunction 

使用cmd运行这个.exe文件:

 cd myCurrentDirectory && myfunction.exe parameter1 parameter2 

请注意,参数现在作为string传递,并且需要考虑原始.m文件。

进一步言论:

  • 我想Matlab仍然需要安装在系统上,虽然没有必要运行它。
  • 我不知道这种方法在多大程度上限制了底层函数的复杂性。
  • 与问题中提出的初步相比,加快速度相对较小

在这里公开的几个方法中,有一个解决方法应该减less多个matlab调用的执行时间。 这个想法是在MATLAB会话中多次运行自定义函数。

例如, myRand.m函数被定义为

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

在matlab命令窗口中,我们像这样生成单行命令

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

它生成以下命令串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); 这是在单个matlab会话中执行的

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

其中一个限制是你需要连续运行4000个函数调用。

我喜欢Magla提出的方法,但考虑到在你的评论中陈述的约束,可以改进,以在一个matlab会话中仍然运行单个函数。

想法是pipeinput和输出。 对于input,你可以检查某个input文件是否存在,是否存在,是否从你的函数中读取input,做功,将输出写入另一个文件,以表示它已经完成了matlab函数的脚本/函数处理结果,正在等待下一个input。

实现使用磁盘文件是非常简单的,有些努力可能通过内存磁盘(即在RAM中打开input/输出文件)完成。

 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; 

如果启动时的迭代次数未知,则还可以在input文件中编码退出条件,而不是立即指定迭代次数。

如果您使用-r选项按照您所描述的方式从命令行启动MATLAB,那么将始终按照您所描述的方式启动一个新实例。 我不相信有这个方法。

如果您从C / C ++应用程序调用MATLAB,则MATLAB将提供MATLAB引擎接口,该接口将连接到任何正在运行的MATLAB实例。

否则,你提到的MATLAB自动化服务器接口是正确的路要走。 如果你发现它很复杂,我会build议发布一个单独的问题,详细说明你已经尝试了什么,以及你有什么困难。

为了完整起见,我会提到MATLAB还有一个可以直接从Java调用的 未公开的接口 – 但是由于它没有文档,所以很难正确使用,并且可能会在不同版本之间进行更改,因此您不应该依赖它。


编辑:从R2014b开始,MATLAB提供了用于Python的MATLAB引擎,通过它可以从Python脚本自动化MATLAB。 而从R2016b开始,还有用于Java的MATLAB Engine。 如果有人以前正在考虑上面提到的无证Java技术,现在就是要走了。