【问题标题】:Integrating Matlab Coder with c#将 Matlab 编码器与 c# 集成
【发布时间】:2013-10-19 19:09:04
【问题描述】:

我想将 MATLAB Coder 输出与 Visual Studio 2010 中的 C# 项目集成。我的主要想法是:

  • 在 Matlab 中创建 *.m 脚本
  • 确保脚本与 Matlab Coder 兼容。
  • 使用 Matlab Coder 生成 C++ 共享库 (DLL)
  • 使用以下方式与 C# 集成:

    //Starts the model execution. May take several minutes
    public static class DllHelper
    {
        [DllImport(@"test.dll",CallingConvention=CallingConvention.Cdecl,EntryPoint = "Run()")]
        public static extern int Run();
    }
    
  • 另外,我希望能够停止执行并检索一些部分结果。为此,我考虑了两种方法:StopExecutionRetrievePartialResults

    [DllImport(@"test.dll",CallingConvention=CallingConvention.Cdecl,EntryPoint =     "StopExecution ()")]
    public static extern int StopExecution ();
    
    [DllImport(@"test.dll",CallingConvention=CallingConvention.Cdecl,EntryPoint = "RetrievePartialResults()")]
    public static extern MyResults RetrievePartialResults();
    

有可能吗?如果没有,是否有任何替代方案?如果是,我在哪里可以找到更多示例?

【问题讨论】:

  • MATLAB Coder 将从您的 MATLAB 函数生成独立的 C/C++ 代码。您可以像使用任何其他本机代码一样在 C# 中使用它:P/Invoke
  • @Amro,你有这个实现的例子吗? (MATLAB 编码器 + DLL + P/Invoke)。有的话我给你50分!

标签: c# matlab dll matlab-deployment matlab-coder


【解决方案1】:

我不知道您的计划是否可行,但 MATLAB Builder NE 可能是一个替代方案。它直接输出一个 .Net dll,对 m 代码没有这些硬性限制。

缺点是,目标机器上需要 MCR。

【讨论】:

    【解决方案2】:

    两种方法我都做过。以前,我们的项目使用 MATLAB Compiler,但我们现在切换到 Coder,因为这避免了必须安装运行时的开销(顺便说一句,它经常无缘无故无法在进程内启动)。

    我们将编码器输出编译为具有 C 接口的非托管 C 项目,并使用 C++/CLR 项目作为包装器。这样做的好处是我们不需要手动指定 P/Invoke 的接口,因为编译器会直接读取头文件。 C++/CLR 程序集链接到将在其中使用代码的 C# 项目。请注意,这有点昂贵,因此请尽量避免在紧密循环中调用 matlab 代码,如果可能的话,最好将整个循环移到库中。

    这是包装库中的一个 sn-p(仍然使用旧的托管 C++ 语法,但在这里没关系)

    bool CTurconConnect2::Init()
    {
          // Call the exported function in the library. Imported using a header file. 
          turcon_initialize();
          // Call one of the matlab functions (in this case, the entry function is manually defined 
          // in the C library, to have a clean interface)
          SetParameters(36.0,400.0,20.0,30.0,15.0,40.0,110.0, 0.0, 100.0);
          return true;
    }
    
    bool CTurconConnect2::Exit()
    {
          turcon_terminate();
          return true;
    }
    

    【讨论】:

      【解决方案3】:

      我认为您编写 DLL 并从 c# 调用它的计划似乎是两种主要方法之一。

      替代方案是:

      使用 MATLAB 作为 C# 引擎的自动化服务器 通过 com 自动化接口。这允许您同时调试 C# 端和 MATLAB 端的 C# 应用程序,使用 每边都有调试器。

      以下是两种方法的示例,甚至还有第三种替代方法(似乎不太推荐)。

      Integrating MATLAB with C# on File Exchange

      【讨论】:

        【解决方案4】:

        我已经实现了您所询问的有关使用 MATLAB 编译器的确切功能。我对 MATLAB Coder 没有任何经验,但应该是相同的原理。编译 MATLAB 库后,您可以在 C# 中使用 P/Invoke 访问它,就像使用任何其他非托管库一样(并且正如您在问题中指定的那样)。

        有几个注意事项:

        1. 我认为您在尝试成功实施“停止执行”策略时可能会遇到设计问题。 MATLAB 可执行文件/库旨在从头到尾执行,而无需对运行时进行太多控制。如果您可以将脚本分成多个部分来处理该设计,那可能会更好。

        2. 编译的 MATLAB 库需要您手动“启动”和“停止”MATLAB 组件运行时,以及每个脚本的组件运行时。因此,执行流程类似于:

          StartMCL();

          StartScript1_Runtime();

          Run_Script1();

          StopScript1_Runtime();

          StopMCL();

        如果您在启动整个 MCL 之前尝试运行“脚本 1 运行时”,应用程序将会崩溃。因此,您需要小心设计包装类以正确处理它。此外,您要确保在退出您的应用程序之前停止一切,否则,MCR 将有效地连续看到 2 次“运行”,并且会崩溃。

        1. 您没有在问题中涉及任何输入/输出参数,但在大多数情况下,您需要使用 MATLAB 函数来创建 MEX 变量以将数据传入/传出 MATLAB 环境。

        这里有一组很棒的示例源,应该涵盖以上所有内容: http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c

        此外,编译器帮助本身也有很多有用的资源。 http://www.mathworks.com/help/compiler/shared-libraries.html

        【讨论】:

          【解决方案5】:

          所以在列表形式中,

          1. 我怀疑您是否能够停止 matlab 代码,除非您将其分解为多个函数,您可以根据需要调用这些函数。
          2. 您应该能够通过调用线程并根据需要停止线程来停止执行,或者更好的是,发送一个信号让线程停止,它将在函数之间中止(为了部分结果)
          3. matlab 是一种糟糕的语言,无法满足第 1 项的要求(并不是说我自己在这方面有过任何好的经验)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-05-10
            • 1970-01-01
            • 1970-01-01
            • 2013-01-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多