Интеграция функций Matlab в проект С#

У меня есть хорошая сборка .net основных функций Matlab, созданная, конечно, с помощью компилятора Matlab. Для функций, которые принимают числа или массивы чисел, это нормально; Я могу писать код на C#, не возвращаясь к Matlab (ну, RCM должен быть установлен, это нормально).

Однако для функций, которые должны ссылаться на другие функции, единственный способ, который я могу найти до сих пор, чтобы запустить программу на С#, — это скомпилировать обе функции в сборку. Чтобы лучше объяснить, предположим, что у меня есть библиотека, в которой я сохранил подпрограмму ode45. Если я хочу решить конкретное уравнение, скажем, что-то простое, например, dy/dx = -y, то мне нужно создать файл сценария Matlab, который можно записать следующим образом:

function dydx = diffeq(x, y)
dydx = -y

[очевидно, что аналитическое решение существует, но ради этого примера допустим, что я хочу решить его таким образом]

Теперь, чтобы решить это уравнение, мне нужно было бы добавить эту функцию в качестве метода в мой класс для компиляции в сборку .net. Это, конечно, разрушает универсальность моей библиотеки; Я хочу, чтобы уравнения для конкретных приложений находились в другой библиотеке, а не в моей основной библиотеке математических функций. То есть метод ODE45 должен находиться в «более базовой» библиотеке, чем библиотека, в которой будет находиться метод «diffeq».

Более того, я бы предпочел создать метод «diffeq» в классе С#, который я могу редактировать непосредственно, например. VS2012. Я хотел бы отредактировать уравнение напрямую, а не каждый раз входить в Matlab и перекомпилировать сборку.

Чтобы решить эту проблему, я пошел на декомпиляцию сборки, которая содержит как код ode45, так и мой метод дифференциального уравнения; получается, что сборка не что иное, как интерфейс к MCR; методы diffeq в сборке возвращают примерно следующее:

return mcr.EvaluateFunction(numArgsOut, “diffeq”, new object[0]);

Отметим, что функция/метод «diffeq» не является частью MCR; МКР не меняется. Однако я не могу найти уравнение нигде в сборке.

Напрашивается вопрос: «Чувак, где моя функция?»

В сборке есть компонент «ресурсы», в котором мы находим [имя класса].ctf, и в нем мы найдем некоторый машинный код. Это выглядит зашифрованным, но уравнение может быть скрыто там. Если это так, то это будет преднамеренная попытка предотвратить, когда я пытаюсь, и слава MathWorks за то, что я не могу избежать входа в приложение Matlab!

Однако в лицензировании, похоже, нет ничего, что могло бы помешать тому, что я хочу сделать; Я думаю, было бы здорово, если бы математические работы позволили такой открытый подход, но пока кто-нибудь знает, как это сделать?


person Randhir Rawatlal    schedule 22.01.2014    source источник


Ответы (1)


«Компилятор MATLAB» имеет несколько вводящее в заблуждение название. Это скорее решение для развертывания, чем компилятор в реальном смысле (см. примечание ниже). В основном он предназначен для распространения приложений MATLAB среди конечных пользователей, не требуя полной установки MATLAB с их стороны (только бесплатный среду выполнения MCR).

Фактически MCR представляет собой урезанную версию движка MATLAB вместе с сопутствующими библиотеками.

Когда вы используете компилятор MATLAB для создания двоичного пакета, результатом является целевая оболочка (будь то автономное приложение, разделяемая библиотека C/C++, пакет Java или сборка .NET), которая вызывает среду выполнения MCR. Сгенерированный двоичный файл включает в себя встроенный архив CTF, содержащий все исходное содержимое MATLAB (ваши M-файлы и другие зависимости), но в зашифрованном виде. При первом выполнении архив CTF извлекается во временную папку, а M-файлы (все еще зашифрованные) затем интерпретируются MCR во время выполнения, как типичный код MATLAB.

В deploytool (mcc -C) есть опция, позволяющая компилятору не встраивать архив CTF в бинарный файл в качестве ресурса, а помещать его в виде отдельного файла рядом с сгенерированным бинарным файлом (этот архив CTF можно просматривать как обычный ZIP-файл). -file, но исходные файлы внутри все еще, конечно, зашифрованы).

См. следующую страницу документации для получения дополнительной информации:

Application Deployment Products and the Compiler Apps


PS: правда в том, что компилятор MATLAB начинался как продукт для преобразования кода MATLAB в полный код C/C++, в котором использовалась "математическая библиотека MATLAB C/C++ Math Library", выпуск которой прекращен (нет требований к среде выполнения, вы просто компилируете сгенерированный код C++ и связываетесь с определенными общими библиотеками; результатом является настоящий скомпилированный исполняемый файл, а не оболочка). Эта функциональность полностью изменилась во времена MATLAB 7. был выпущен (причина в том, что старый способ поддерживал только подмножество языка MATLAB, а использование текущего механизма MCR позволяет развертывать практически любой код). Спустя годы MATLAB добавила новый продукт для замены ранее удаленной функции перевода кода, а именно MATLAB. Кодер.

person Amro    schedule 23.01.2014
comment
То есть вы говорите, что обычный код MATLAB может быть доступен во временной папке во время работы программы? - person Ben Voigt; 25.01.2014
comment
Извините, моя формулировка была немного двусмысленной; Извлеченные файлы остаются в зашифрованном виде (шифрование AES). Я предполагаю, что MCR знает секретный симметричный ключ и, следовательно, может расшифровать, а затем выполнить код, как обычно. Забавно то, что зашифрованы только M-файлы (есть и другие файлы ресурсов и настройки из вашего prefdir, включенные в этот CTF-архив, которые не зашифрованы). Структура каталогов реплицируется с теми же именами файлов, но содержимое М-файлов в основном тарабарщина. - person Amro; 25.01.2014