2013-10-11 3 views
4

Я хочу интегрировать вывод MATLAB Coder с C# проекта в Visual Studio 2010. Моя основная идея заключается в том:Интеграция Matlab Coder с C#

  • Создать * .m скрипт в Matlab
  • Убедитесь, что сценарий совместим с Matlab Coder.
  • Генерация C++ разделяемой библиотеки (DLL) с Matlab Coder
  • Интеграция с 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(); 
    } 
    
  • Кроме того, я хотел бы быть в состоянии остановить выполнение и получить некоторые частичные Результаты. Чтобы сделать это, я думал, двумя способами: StopExecution и RetrievePartialResults

    [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 Coder будет генерировать автономные C/C++ кода из функций MATLAB. Вы используете его в C# так же, как и любой другой собственный код: P/Invoke – Amro

+0

@Amro, у вас есть пример этой реализации? (MATLAB Coder + DLL + P/Invoke). Я даю вам 50 очков, если у вас есть! – guilhermecgs

ответ

3

Я понятия не имею, работает ли ваш план, но MATLAB Builder NE может быть альтернативой. Он напрямую выводит .Net dll без этих жестких ограничений на m-код.

Недостатком является то, что MCR требуется на целевой машине.

2

Я думаю, что ваш план написания DLL и вызова его из C# кажется одним из двух основных способов.

В качестве альтернативы было бы:

использовать MATLAB в качестве сервера автоматизации из C# с использованием двигателя интерфейс с помощью автоматизации ком. Это позволяет одновременно отлаживать ваше приложение C# со стороны C# и стороны MATLAB, используя отладчики с каждой стороны.

Ниже приведены примеры как для обоих методов, так и для третьего альтернативного метода (который кажется менее рекомендованным).

Integrating MATLAB with C# on File Exchange

1

Я достиг точной функции вы просите об использовании MATLAB Compiler. У меня нет опыта работы с MATLAB Coder, но должен быть тем же принципом. После того, как вы собрали библиотеку MATLAB, вы можете получить к ней доступ, используя P/Invoke на C#, как и с любой другой неуправляемой библиотекой (и, как вы указали в своем вопросе).

Theres пару предостережений:

  1. Я думаю, что вы, возможно, проблема дизайн-мудрый пытается успешно реализовать «остановить выполнение» стратегии. Исполняемые файлы/библиотеки MATLAB предназначены для выполнения от начала до конца без значительного контроля над временем выполнения. Если вы можете разделить свой сценарий на несколько частей для обработки этого дизайна, это может работать лучше.

  2. Скомпилированные библиотеки MATLAB требуют «запуска» и «остановки» времени выполнения компонента MATLAB вручную, а также времени выполнения компонента для каждого скрипта.Таким образом, поток выполнения будет выглядеть примерно так:

    StartMCL();

    StartScript1_Runtime();

    Run_Script1();

    StopScript1_Runtime();

    StopMCL();

Если вы попытаетесь запустить «Script 1 Runtime» перед запуском общего MCL, приложение выйдет из строя. Таким образом, вам нужно быть осторожным с тем, как вы создаете класс-оболочку для правильной обработки. Кроме того, вы должны быть уверены, что все остальное прекратите, прежде чем выйти из приложения, иначе MCR эффективно увидит 2 «Runs» подряд и сработает.

  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-компилятор, но теперь мы переключились на Coder, потому что это позволяет избежать накладных расходов на установку среды выполнения (что, кстати, часто не запускалось внутри процесса без видимых причин).

Скомпилировать вывод кодера как неуправляемый проект C с интерфейсом C и использовать проект C++/CLR в качестве обертки. Это имеет то преимущество, что нам не нужно вручную указывать интерфейс для P/Invoke, поскольку компилятор будет непосредственно читать файлы заголовков. Сборка C++/CLR связана с проектом C#, где код будет использоваться. Имейте в виду, что это довольно дорого, поэтому старайтесь избегать вызова matlab-кода в узком цикле и лучше перемещать весь цикл в библиотеку, если это возможно.

Вот фрагмент из библиотеки оболочки (по-прежнему использует синтаксис старый Managed 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 (не то, что я когда-либо имел какой-либо хороший опыт работы с ним сам)
Смежные вопросы