У меня есть хорошая сборка .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!
Однако в лицензировании, похоже, нет ничего, что могло бы помешать тому, что я хочу сделать; Я думаю, было бы здорово, если бы математические работы позволили такой открытый подход, но пока кто-нибудь знает, как это сделать?