2013-10-11 48 views
4

我想MATLAB编码器输出,在Visual Studio C#项目纳入2010年我主要的想法是:集成Matlab的编码器使用C#

  • 在Matlab中创建一个* .M脚本
  • 确保脚本与Matlab编码器兼容。
  • 生成一个C++共享库(DLL)用Matlab编码器
  • 使用像这样用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(); 
    

是否有可能呢?如果否,是否有其他选择?如果是的话,我可以在哪里找到更多的例子?

+1

MATLAB编码器会产生从MATLAB功能独立的C/C++代码的要求,一个可怕的语言。你可以像使用其他本地代码一样在C#中使用它:P/Invoke – Amro

+0

@Amro,你有这个实现的例子吗? (MATLAB编码器+ DLL + P /调用)。如果你有我给你50分! – guilhermecgs

回答

3

我不知道你的计划是否可行,但MATLAB Builder NE可能是另一种选择。它直接输出一个没有硬限制的.Net dll的m代码。

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

2

我认为你写一个DLL的计划,并从C#调用它似乎是两种主要方式之一。

的替代方案是:通过COM自动化使用发动机 接口

使用MATLAB作为自动化服务器从C#。这允许您在C#端和MATLAB端同时调试您的C#应用​​程序的 ,每边使用 调试器。

下面是这两种方法的例子,甚至第三个替代方法(似乎不太推荐)。

Integrating MATLAB with C# on File Exchange

1

我已经取得了你问如何使用MATLAB编译器的确切功能。我对MATLAB编码器没有任何经验,但应该是相同的原理。一旦你编译了一个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

3

我做了两种方式。以前,我们的项目使用MATLAB编译器,但现在我们切换到编码器,因为这样可以避免必须安装运行时的开销(因为没有明显的原因,它往往无法在流程内部启动)。

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

下面是从包装库片段(仍然使用旧的托管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; 
} 
1

所以以列表的形式,

  1. 我怀疑你将能够停止matlab代码,除非你把它分解成多个函数,你可以根据需要调用它。
  2. 您应该能够通过调用线程并根据需要停止线程来暂停执行,或者更好地发送线程停止的信号,以便在函数之间中止(用于部分结果的目的)
  3. 即MATLAB是履行对第1项(不,我有过什么好的经验与它自己)