作为硕士论文的一部分,我正在为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会找到新值并继续工作。
我可以想象这种方法运行得更快,但实际上它有点棘手,直到它无效。
我很感谢有关您的经历或想法的任何报道。
答案 0 :(得分:1)
提供尚未列出的几个选项:
如果您使用SAGE,则可以从单个脚本中call both MATLAB and C code。您可能必须在Cython中包装C代码,但这很容易。从技术上讲,你不会从C调用MATLAB,而是从第三个脚本调用MATLAB和C,但结果是相同的。
如果您愿意将MATLAB翻译成非常相似的Numpy脚本,您可以使用Cython编译复杂的代码并将其整合得非常干净。我已多次完成这些翻译,这是一个非常轻松的过程。