Связываем Matlab и C#
Часто задачи программирования требуют точности вычислений и невозможно достичь требуемую точность (десятки знаков после занятой) используя обычные языки программирования. В таких случаях целесообразно производить вычисления в специально предназначенной для этого среде, например в Matlab.
Среда Matlab специально предназначена для научных вычислений, моделирования процессов и т.п. Подпрограммы вычислений в Matlab пишутся на встроенной языке - M и имеют расширение .m. Так же среда содержит несколько встроенных компиляторов, позволяющих откомпилировать код на встроенном языке в сборки/пакеты на других языках. Поддерживаются .NET, C, C++, Java, addin к Excel. На выходе мы получаем на выбор: managed dll, unmanaged dll, java сборка или com-объект соответственно. Если нет желания писать отдельное приложение то можно сгенерировать GUI на том же M языке.
В этой статье мы будем учиться использовать сгенерированные в Matlab managed dll. В терминах .NET Framework managed dll называется сборкой или assembly, так я и буду их называть в дальнейшем.
Чтобы собрать свою dll нужно пройти через несколько несложных шагов.
Для начала необходимо реализовать на встроенном языке необходимый вам алгоритм либо самостоятельно либо с использованием встроенных функций языка.
Пример программы на языке M. Интерполяция методом Ньютона.
Следующим шагов создадим новый Deployment Project и выберем .NET Component.
Далее добавим в проект заранее написанный m-файл.
Скомпилируем проект нажатием кнопки "Build the project". При желании можем так же запаковать приложение в zip-архив, который будет включать в себя собранную dll а так же runtime, необходимый для запуска приложений, использующих сделанные нами сборки.
Перед вызовом процедур необходимо добавить скомпилированные библиотеки в разделе References проекта и подключить
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using Lagranje; //Название скомпилированного нами проекта
Так же необходимо добавить в References MWArray.dll расположенную по адресу C:\Program Files\MATLAB\R2009a\toolbox\dotnetbuilder\bin\win32\v2.0
Пример процедуры вызывающей метод из скомпилированной нами dll
public double GetMatlabSolve(double argx)
{
Lagranje.Lagranje lg = new Lagranje.Lagranje();
MWArray RetVal = lg.lagrange(argx, (MWNumericArray)pointx, (MWNumericArray)pointy);
return ((MWNumericArray)RetVal)[1].ToScalarDouble();
}
Как видим, активно используется приведение типов, именно для этого и требуется библиотека MWArray.dll. Использование Matlab runtime довольно затратная по времени процедура и выполнять ее лучше в отдельном потоке.
- Комментировать (войти)
Комментарии
Очень полезная статья!
Очень полезная статья! Спасибо огромное! Вот только возникла проблема. Всё получилось откомпилить, импортировать dll в C# и т.д. но при создании экземпляра класса из dllки (Lagranje.Lagranje lg = new Lagranje.Lagranje();) выпрыгивает исключение TypeInitializationException. У вас подобные проблемы были? Как вы думаете, почему такое происходит?
Нет, никогда такого не было.
Нет, никогда такого не было. Вероятно зависит от m-кода, хорошо бы его увидеть.
TypeInitializationException - лишь оболочка исключения, под ним скрывается что-то ещё
Спасибо большое за ответ. Я
Спасибо большое за ответ. Я разобрался с проблемой. Просто у меня в matlab по умолчанию был другой компилятор указан... Исправил, всё заработало! :)
Невозможно загрузить файл или
Невозможно загрузить файл или сборку "MWArray, Version=2.10.0.0, Culture=neutral, PublicKeyToken=e1d84a0da19db86f" или один из зависимых от них компонентов. Была сделана попытка загрузить программу, имеющую неверный формат.
Вот такое выпадает....
+ вопрос -- насколько такой перенос функций В С# самодостаточен...
Т.е. приложение заработает на машине, где не установлен Matlab?
Какой .NET Framework
Какой .NET Framework используется? вероятно проблема в этом
Чтобы запустить полученную программу на клиентской машине необходим установить Matlab Runtime, инсталятор которого под именем MCRInstaller.exe находится в папке C:\Program Files\MATLAB\R2009a\toolbox\compiler\deploy\win32
Необходимо только это, сам Matlab не нужен