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

通过外部应用程序调用函数,而无需打开新的Matlab实例,matlab,batch-file,lua,cmd,function-calls,Matlab,Batch File,Lua,Cmd,Function Calls,是否有一种方法可以从外部调用Matlab函数,特别是通过Windowscmd(还有Linux终端、LUA脚本等),而无需每次打开一个新的Matlab实例 例如在cmd中: matlab -sd myCurrentDirectory -r "function(parameters)" -nodesktop -nosplash -nojvm 相对较快地打开一个新的Matlab实例并执行我的函数。打开和关闭这个简化的matlab提示符大约需要2秒钟(无需计算)——因此执行4000次需要2个多小时。我

是否有一种方法可以从外部调用Matlab函数,特别是通过Windows
cmd
(还有Linux终端、LUA脚本等),而无需每次打开一个新的Matlab实例

例如在
cmd
中:

matlab -sd myCurrentDirectory -r "function(parameters)" -nodesktop -nosplash -nojvm
相对较快地打开一个新的Matlab实例并执行我的函数。打开和关闭这个简化的matlab提示符大约需要2秒钟(无需计算)——因此执行4000次需要2个多小时。我希望避免这种情况,因为被调用的函数总是位于同一个工作区中。是否可以始终在同一实例中执行此操作

我已经做了一些研究,并发现了这种可能性,但对我来说,这似乎相当复杂,我看不到使其适用于我的案例的必要步骤。有什么建议吗


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

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

如果您是从C/C++应用程序调用MATLAB,MATLAB提供了接口,可以连接到MATLAB的任何运行实例

否则,您提到的MATLAB自动化服务器接口就是正确的选择。如果你觉得这很复杂,我建议你单独提问,详细说明你做了什么,遇到了什么困难

为了完整性,我要提到的是,MATLAB也可以直接从Java调用——但是,由于它没有文档记录,所以很难正确使用,并且可能会在不同版本之间发生更改,因此您不应该依赖它



编辑:从R2014b开始,MATLAB提供了用于Python的MATLAB引擎,通过该引擎,您可以从Python脚本中自动化MATLAB。从R2016b开始,还有用于Java的MATLAB引擎。如果以前有人考虑过上述未记录的Java技术,现在就应该这样做。

在这里公开的几种方法中,有一种解决方法可以减少多个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(1101);B(2)=迈朗(2102);B(3)=迈朗(3103);B(4)=迈朗(4104);B(5)=迈朗(5105)在单个matlab会话中使用

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

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

基于@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
使用
cmd
运行此
.exe
-文件:

cd myCurrentDirectory && myfunction.exe parameter1 parameter2
请注意,参数现在以字符串形式传递,考虑到这一点,需要调整原始的
.m
-文件

进一步评论:

  • 不过,我想系统上还需要安装Matlab 没有必要运行它
  • 我不知道这个方法在多大程度上受限于 基本功能
  • 与问题中给出的初始方法相比,速度为 相对较小

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

这个想法是通过管道传输你们的输入和输出。对于输入,您可以检查某个输入文件是否存在,如果存在,则从中读取函数的输入,执行工作,将输出写入另一个文件,以向脚本/函数处理结果发送信号,表明它的matlab函数已完成,正在等待下一个输入

使用磁盘文件实现是非常简单的,经过一些努力,可能可以通过内存磁盘实现(即,在RAM中打开输入/输出区域)


如果开始时迭代次数未知,也可以在输入文件中对退出条件进行编码,而不是立即指定迭代次数。

此处已启用,以便使用终端多路复用器在已经运行的matlab会话上附加进程。@Magla:似乎是Linux的完美解决方案,当我可以将我的接口移植到Linux时,我一定会尝试它。目前,我仅限于Windows,并试图在这里找到一个临时解决方案。与tmux相反,另一个名为的软件可以通过cygwin执行(请参阅)。您建议的基本问题是,第二个函数调用的参数由第一个调用的参数确定。两次调用之间的输出和输入由另一个应用程序处理。这是一个很好的方法!我必须做一些必要的编辑才能让它工作,1)我不能使用
!isfile
命令和2)每次迭代后都需要删除输入文件。看一看我的编辑,然后我接受了答案。同龄人拒绝了我的编辑,我不知道为什么。但像这样,你们的答案就不起作用了。@thewaywalk——对,我在写答案时电脑上并没有matlab,所以无法检查语法——这更多的是为了说明这个想法,而不是一个有效的例子。我很高兴这种方法奏效了!
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;