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

时间:2013-09-13 08:35:32

标签: matlab batch-file lua cmd function-calls

有没有办法从外部调用Matlab函数,特别是Windows cmd(还有Linux终端,LUA脚本等),没有每次都打开一个新的Matlab实例?

例如cmd

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

相对快速地打开一个新的Matlab实例并执行我的函数。打开和关闭这个减少的matlab提示大约需要2秒钟(没有计算) - 因此4000次执行超过2小时。我想避免这种情况,因为被调用的函数总是位于同一个工作区中。它可以在同一个实例中完成吗?

我已经做了一些研究,发现了MATLAB COM Automation Server的可能性,但对我来说似乎很复杂,我没有看到让它适用于我的案例的基本步骤。有什么建议吗?

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

4 个答案:

答案 0 :(得分:3)

基于@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;

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

mcc -m myfunction

使用.exe运行此cmd - 文件:

cd myCurrentDirectory && myfunction.exe parameter1 parameter2

请注意,参数现在作为字符串传递,而原始.m - 文件需要根据需要进行调整。

进一步评论:

  • 我猜Matlab仍然需要安装在系统上 没有必要运行它。
  • 我不知道这种方法分别限制了多远的复杂性 基本功能。
  • 与问题中给出的初始计算相比,加速是
  • 相对较小

答案 1 :(得分:1)

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

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

否则您提到的MATLAB Automation Server接口是正确的方法。如果您发现它很复杂,我建议您发一个单独的问题,详细说明您尝试过的内容以及您遇到的困难。

为了完整起见,我会提到MATLAB也可以直接从Java调用has an undocumented interface - 但是,因为它没有文档,所以很难正确,并且可能会因版本而异,所以你不应该依赖它。


编辑:从R2014b开始,MATLAB提供了用于Python的MATLAB Engine,通过它可以从Python脚本自动化MATLAB。从R2016b开始,还有MATLAB Engine for Java。如果有人以前考虑过上面提到的未记录的Java技术,现在就可以采用这种方法。

答案 2 :(得分:1)

在这里公开的几种方法中,有一种解决方法可以减少多个matlab调用的执行时间。我们的想法是在matlab会话中多次运行自定义函数。

例如,myRand.m函数定义为

function r = myRand(a,b)
r = a + (b-a).*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个函数调用。

答案 3 :(得分:1)

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

想法是管道输入和输出。对于输入,您可以检查某个输入文件是否存在,是否存在,从中读取函数的输入,执行工作,将输出写入另一个文件以指示脚本/函数处理结果,即matlab函数已完成并正在等待下一个输入。

使用磁盘文件实现非常简单,只需要付出一些努力就可以通过内存磁盘(即RAM中的开放输入/输出fiels)来实现。

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;

如果启动时迭代次数未知,您还可以对输入文件中的退出条件进行编码,而不是立即指定迭代次数。