2

作为我硕士论文的一部分,我正在为 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-Code

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

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

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

我可以想象这工作得更快,但在它没有错误之前实施起来肯定有点棘手。


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

4

1 回答 1

1

提供一些尚未列出的选项:

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

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

于 2013-09-05T22:42:12.440 回答