在C-Routine中启动matlab代码的最有效方法

时间:2013-09-05 16:25:47

标签: c matlab matlab-compiler matlab-coder

作为硕士论文的一部分,我正在为MBS软件编写一个外部C-Subroutine,以便像一个强制元素一样工作:

force=subfunction(displacement)

有一个Matlab代码执行此操作,并且在C中实现它非常耗时。

所以我认为以下选项可以最有效地克服这个问题:

1。使用Matlab-Compiler创建.exe并从C

启动它

非常好的简单解决方案。然而问题是mbs-solver调用函数> 10000次并且编译的Matlab可执行文件必须每次都加载MCR(Matlab编译器运行时)!处理时间非常短(~0.002秒)但是对于每个迭代步骤,MCR的加载花费大约 5秒(!)。这使得这个选项对我来说无用。

http://www.mathworks.de/support/solutions/en/data/1-1ARNS/

“每次启动已编译的可执行文件时,基本上都会启动另一个MATLAB实例。”

2。使用Matlab-Compiler创建共享库等

我没试过这个。就我研究而言,我明白,对于这些选项,MCR必须像选项1那样每一步启动。

3。使用Matlab-Coder生成C代码

就我有时尝试而言,这不是一个简单的选择。应优化生成的代码。它真的会更有效率吗?

4。仅在第一次启动Matlab-Executable而不关闭它并通过任何文件传递C代码

只是一个概念:我想启动Matlab-Exe。在第一个迭代步骤中,让写一个内容为“位移”的文件。然后我会从Matlab扫描文件的每一毫秒,如果有任何新的值。我会处理它并写入另一个文件,并且每隔几毫秒扫描结果文件的C-Routine会找到新值并继续工作。

我可以想象这种方法运行得更快,但实际上它有点棘手,直到它无效。


我很感谢有关您的经历或想法的任何报道。

1 个答案:

答案 0 :(得分:1)

提供尚未列出的几个选项:

  • 如果您使用SAGE,则可以从单个脚本中call both MATLAB and C code。您可能必须在Cython中包装C代码,但这很容易。从技术上讲,你不会从C调用MATLAB,而是从第三个脚本调用MATLAB和C,但结果是相同的。

  • 如果您愿意将MATLAB翻译成非常相似的Numpy脚本,您可以使用Cython编译复杂的代码并将其整合得非常干净。我已多次完成这些翻译,这是一个非常轻松的过程。