Когда есть желание пользоваться m-файлами на стороне, например, впихнуть хорошо работающие методы аппроксимации из Curve Fitting Toolbox в какую нибудь стороннюю свою разработку, можно скомпилировать dll-библиотеку и использовать ее по своему разумению.

Данная статья - кратко по шагам действия.

Инструменты:

  • MATLAB 2022a

    • MATLAB Compiler Runtime

  • VS Community C# 2020

Итак, приступим.

Сборка DLL

В матлабе создаем m-файл с желаемой функцией, например такой

function koeffs = solve_lsm(n,x,y,wts)
    
    str = strcat('poly',num2str(n));
    opts = fitoptions('Weights',wts);
    ftype = fittype(str);
    result = fit(x',y',ftype,opts);
    koeffs = coeffvalues(result)';

end

В командной строке матлаба вызываем deploytool, в окошке выбираем Library Compiler

В появившемся окне указываем данные: название библиотеки, версия, разработчик и другие. Из важного:

  • Окошко TYPE выбираем ".NET Assembly"

  • Окошко EXPORTED FUNCTIONS добавляем m-файлы с нужными нам функциями.

  • Внизу поле Class Name задаем имя класса, содержащего создаваемые нами фунции

  • Так же по желанию можно выбрать способ загрузки Matlab Runtime

Нажимаем галочку Package

Формируются папки:

В папке for_redistribution можно запустить MyAppInstaller_web.exe, чтобы установить Matlab Runtime, который распространяется бесплатно и, соответственно, на компьютерах пользователей вашим ПО с созданной DLL не нужны дополнительные лицензии, достаточно установить Matlab Runtime и Framework.

Подключение DLL в проект VS C# 2020

Создаем консольное приложение (.NET Framework)

Подключаем две библиотеки: созданную нами LSMLib и поставляемую вместе с Matlab библиотеку MVArray. По умолчанию она находится тут: MATLAB\R2022a\toolbox\dotnetbuilder\bin\win64\v4.0\

using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using LSMLib;

Пишем код, что-то вроде этого:

//пример массивов, которые будем аппроксимировать
double n = 3;
double[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
double[] y = {3,5,4,6,7,7,4,5,6,7,8,9,6,6,7};
double[] wts = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
                       
//вызов нашей функции из библиотеки
LSMLib.LSMLib test = new LSMLib.LSMLib();
MWArray res = test.solve_lsm((MWArray)n, (MWNumericArray)x, \
																			(MWNumericArray)y, (MWNumericArray)wts);

Если нужно преобразовать массив матлаба в список, можно сделать например так:

//обработка возвращаемых коэффициентов и перевод их в обычный список
var array = (MWNumericArray)res; 
var dd = (double[,])array.ToArray(MWArrayComponent.Real);

List<double> koeffs = new List<double>();
for (int i = 0; i < dd.Length; i++)
{
		koeffs.Add(dd[i, 0]);
}

Компилируем. Обязательно выбираем среду, у меня x64

Исходник на гитхабе

Литература:

https://habr.com/ru/post/132487/

https://www.youtube.com/watch?v=5qDkr4GKwAw

Комментарии (4)


  1. Kekushiftkey
    15.04.2022 17:36

    Но когда начался политический кризис, наши компании немного напряглись, так как мы поставляем американский софт, с которым может «что-то произойти». Мы поняли, что теперь просто тренинги – это не решение проблемы, и решили открыть направление разработки под ключ, причем такое, которое будет проводиться вместе с нашими клиентами.

    https://habr.com/ru/post/525734/

    MATLAB — отзыв лицензий у российских студентов и университетов


  1. E1ektr0
    15.04.2022 21:51
    +1

    Тоже делал всё это.
    Пытался сначала матлаб на .net core завести упаковав всё в докер.
    И даже сделал. Но, начали возникать какие то проблемы с рендером картинок, а проект уже начинал загораться, пришлось на .net framework всё вернуть. А жаль.


  1. sairus777
    16.04.2022 03:14
    +1

    Рекомендую переходить на Julia по многим причинам. Можно прямо интерпретатор вызывать, а можно компилить портативные либы в PackageCompiler.jl (немного громоздко, зато все прозрачно и бесплатно).


  1. timofeevka
    17.04.2022 12:25
    +1

    Я советую сейчас на матлаб не ориентироваться в серьёзных проектах.