Связываем Matlab и C#

in

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

Чтобы запустить полученную программу на клиентской машине необходим установить Matlab Runtime, инсталятор которого под именем MCRInstaller.exe находится в папке C:\Program Files\MATLAB\R2009a\toolbox\compiler\deploy\win32
Необходимо только это, сам Matlab не нужен