通过外部应用程序调用一个函数,而无需打开一个新的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技术,现在就是要走了。