有没有办法从外部调用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
(但在最坏的情况下)。
答案 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
- 文件需要根据需要进行调整。
进一步评论:
答案 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 -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;
如果启动时迭代次数未知,您还可以对输入文件中的退出条件进行编码,而不是立即指定迭代次数。