Когда есть желание пользоваться 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
![](https://webcf.waybackmachine.org/web/20220508132009/https://habrastorage.org/getpro/habr/upload_files/320/449/c3b/320449c3b8f3b410d7628a78aa95bcc4.png)
В появившемся окне указываем данные: название библиотеки, версия, разработчик и другие. Из важного:
Окошко TYPE выбираем ".NET Assembly"
Окошко EXPORTED FUNCTIONS добавляем m-файлы с нужными нам функциями.
Внизу поле Class Name задаем имя класса, содержащего создаваемые нами фунции
Так же по желанию можно выбрать способ загрузки Matlab Runtime
![](https://webcf.waybackmachine.org/web/20220508132009/https://habrastorage.org/getpro/habr/upload_files/32e/3dc/bef/32e3dcbef9bce1fa4012e420de4ed31d.png)
Нажимаем галочку Package
![](https://webcf.waybackmachine.org/web/20220508132009/https://habrastorage.org/getpro/habr/upload_files/2af/b42/28f/2afb4228f10fca6ea4b13c784bad5e2a.png)
Формируются папки:
![](https://webcf.waybackmachine.org/web/20220508132009/https://habrastorage.org/getpro/habr/upload_files/f98/8d0/51d/f988d051d10a54283e3cf19efab607bc.png)
В папке for_redistribution можно запустить MyAppInstaller_web.exe, чтобы установить Matlab Runtime, который распространяется бесплатно и, соответственно, на компьютерах пользователей вашим ПО с созданной DLL не нужны дополнительные лицензии, достаточно установить Matlab Runtime и Framework.
Подключение DLL в проект VS C# 2020
Создаем консольное приложение (.NET Framework)
![](https://webcf.waybackmachine.org/web/20220508132009/https://habrastorage.org/getpro/habr/upload_files/468/be2/1b5/468be21b59d8bccca783ca687869361e.png)
Подключаем две библиотеки: созданную нами LSMLib и поставляемую вместе с Matlab библиотеку MVArray. По умолчанию она находится тут: MATLAB\R2022a\toolbox\dotnetbuilder\bin\win64\v4.0\
![](https://webcf.waybackmachine.org/web/20220508132009/https://habrastorage.org/getpro/habr/upload_files/390/c27/f40/390c27f407f91588b91fb807a7ff832c.png)
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
Исходник на гитхабе
Литература: