Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C例程中启动matlab代码的最有效方法_C_Matlab_Matlab Compiler_Matlab Coder - Fatal编程技术网

在C例程中启动matlab代码的最有效方法

在C例程中启动matlab代码的最有效方法,c,matlab,matlab-compiler,matlab-coder,C,Matlab,Matlab Compiler,Matlab Coder,作为我硕士论文的一部分,我正在为MBS软件编写一个外部C-子程序,以便作为力元素工作,例如: force=subfunction(displacement) 有一个Matlab代码在做这件事,用C实现它非常耗时 因此,我认为以下选项是克服这一问题最有效的方法: 一,。使用Matlab编译器创建.exe并从C启动 非常好的解决方案。然而,问题是mbs解算器调用函数的次数>10000次,编译的Matlab可执行文件每次都必须加载MCR(Matlab编译器运行时)!处理时间非常短(~0.001秒),

作为我硕士论文的一部分,我正在为MBS软件编写一个外部C-子程序,以便作为力元素工作,例如:

force=subfunction(displacement)
有一个Matlab代码在做这件事,用C实现它非常耗时

因此,我认为以下选项是克服这一问题最有效的方法:

一,。使用Matlab编译器创建.exe并从C启动

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

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

二,。使用Matlab编译器创建共享库等

我还没试过这个。据我所知,对于这些选项,MCR也必须像选项1一样每一步都启动

三,。使用Matlab编码器生成C代码

就我有时尝试的那样,这不是一个容易的选择。应该优化生成的代码。它真的会更有效率吗

四,。仅在第一次启动Matlab可执行文件时,不关闭它并通过任何文件传递C代码

只是一个概念:我想开始Matlab Exe。在第一个迭代步骤中,让我们编写一个包含“置换”内容的文件。然后,如果有任何新值出现,我会每秒扫描一次Matlab中的文件。我将处理它并写入另一个文件,每毫秒扫描一次结果文件的C例程将找到新值并继续工作

我可以想象这工作得更快,但在没有bug之前,实现起来肯定有点棘手



非常感谢您提供有关您的经验或想法的任何报告。

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

  • 如果使用,则可以从单个脚本执行。您可能需要将C代码打包,但这相当简单。从技术上讲,您不会从C调用MATLAB,而是从第三个脚本调用MATLAB和C,但结果是相同的

  • 如果您愿意将MATLAB翻译成一个非常类似的脚本,那么可以使用Cython编译复杂的代码,并将其非常干净地集成在一起。我已经做了几次这些翻译,这是一个相当轻松的过程


在第二个选项中,您不必每次迭代都初始化MCR;您将根据生成的共享库构建链接的C程序,在开始时初始化它一次,然后在循环中调用函数。如果您的MATLAB代码与MATLAB Coder兼容(或可以使其兼容),那么我真的认为选项3是可行的。通常,使用编码器生成的独立可执行文件的执行速度比使用编译器生成的等效文件快。正如您提到的,您避免了启动MCR的需要,但也避免了与执行通过MATLAB解释的代码相关的开销。这可能是非常重要的(作为一个例子,考虑Simulink中的“加速器模式”基本上仅仅通过在场景中生成/构建/执行代码),你已经评论了选项3不是一个简单的选择。你遇到过什么特别的问题吗?