【发布时间】:2013-09-09 14:10:08
【问题描述】:
作为我硕士论文的一部分,我正在为 MBS 软件编写一个外部 C 子程序,以便作为一个力元件工作,例如:
force=subfunction(displacement)
有一个 Matlab 代码可以做到这一点,并且在 C 中实现它非常耗时。
所以我认为以下选项是克服这个最有效的方法:
1.使用 Matlab-Compiler 创建一个 .exe 并从 C 启动它
非常好的和简单的解决方案。然而问题是 mbs-solver 调用函数 >10000 次,并且编译的 Matlab 可执行文件必须每次都加载 MCR(Matlab 编译器运行时)!处理时间非常短(~0.001 秒),但每个迭代步骤的 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 会找到新值并继续工作。
我可以想象这会更快,但在没有错误之前实现起来肯定有点棘手。
感谢有关您的经历或想法的任何报告。
【问题讨论】:
-
在第二个选项中,您不必每次迭代都初始化 MCR;您将构建与生成的共享库链接的 C 程序,在开始时对其进行一次初始化,然后在循环中调用该函数。
-
如果您的 MATLAB 代码与 MATLAB Coder 兼容(或可以兼容),那么我真的认为选项 3 是可行的方法。通常,使用 Coder 生成的独立可执行文件的执行速度比使用 Compiler 生成的等效文件要快。正如您所提到的,您无需启动 MCR,还避免了与执行通过 MATLAB 解释的代码相关的开销。这可能非常重要(例如,考虑到 simulink 中的“加速器模式”基本上只通过在幕后生成/构建/执行代码来工作)
-
您曾评论说选项 3 不是一个简单的选项。您遇到过什么特别的问题吗?
标签: c matlab matlab-compiler matlab-coder