将matlab函数集成到c#项目中

时间:2014-01-22 12:23:51

标签: c# .net matlab .net-assembly matlab-compiler

我有一个很好的.net组件的核心matlab函数,当然是用matlab编译器创建的。对于接受数字或数字数组的函数,这很好;我可以用c#编写代码,而不必回复到matlab(好吧,RCM必须安装;没关系)。

对于必须引用其他函数的函数,到目前为止我能找到的唯一方法是将两个函数编译到程序集中。为了更好地解释,假设我有一个库,我已经存储了ode45例程。如果我想解决一个特定的等式,让我们说一些简单的东西,比如dy / dx = -y,那么我必须创建一个matlab脚本文件,可以写成如下:

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

[显然解析解存在,但为了这个例子,让我说我想用这种方式解决它]

现在为了解决这个等式,我必须将这个函数添加为我的类中的一个方法,以便编译成.net程序集。这当然破坏了我图书馆的普遍性;我想在不同的库中将特定于应用程序的方程式转换为我的核心数学函数库。也就是说,ODE45方法应该驻留在“更核心”的库中,而不是“diffeq”方法所在的库。

除此之外,我更倾向于在c#类中创建“diffeq”方法,我可以直接在其中编辑。 VS2012。我想直接编辑方程,而不是每次都要输入matlab并重新编译程序集。

为了解决这个问题,我已经完成了对包含ode45代码和微分方程方法的程序集进行反编译的程度。事实证明,组件只不过是MCR的接口;程序集中的diffeq方法返回如下内容:

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

我们注意到函数/方法“diffeq”不是MCR的一部分; MCR不会改变。但是,我无法在装配中的任何位置找到等式。

这引出了一个问题“伙计,我的职能在哪里?”

程序集中有一个'resources'组件,我们在其中找到[classname] .ctf,并且我们会找到一些机器代码。这看起来是加密的,但这个等式可能隐藏在那里。如果是这样的话,这将是一次故意的尝试,以防止我在尝试时,并且向MathWorks致敬,因为我无法避免进入matlab应用程序!

然而,在许可方面似乎没有任何东西可以阻止我想要做的事情;我认为如果mathworks允许这样开放的方法会很好,但在interrim中,有没有人知道如何做到这一点?

1 个答案:

答案 0 :(得分:1)

“MATLAB编译器”有一个误导性的名称。在实际意义上,它更像是部署解决方案而不是编译器(参见下面的注释)。它主要用于将MATLAB应用程序分发给最终用户,而无需安装完整的MATLAB(仅需要安装免版税MCR runtime)。

MCR实际上是MATLAB引擎的精简版本以及附带的库。

当您使用MATLAB Compiler生成二进制包时,结果是一个特定于目标的包装器(无论是独立应用程序,C / C ++共享库,Java包还是.NET程序集),它们调用MCR运行时。生成的二进制文件包含一个嵌入式CTF存档,其中包含所有原始MATLAB内容(您的M文件和其他依赖项),但是采用加密形式。首次执行时,CTF存档被解压缩到临时文件夹,然后MCR文件(仍然是加密的)在运行时由MCR解释,就像典型的MATLAB代码一样。

deploytoolmcc -C)中有一个选项告诉编译器不要将二进制文件中的CTF存档作为资源嵌入,而是将其作为生成的二进制文件旁边的单独文件(此CTF存档可以作为常规ZIP文件进行检查,但当然内部的源文件仍然是加密的。)

有关详细信息,请参阅以下文档页面:

  

Application Deployment Products and the Compiler Apps


PS:事实是MATLAB Compiler开始作为将MATLAB代码转换为完整的C / C ++代码的产品,该代码使用了现已停用的“MATLAB C / C ++ Math Library”(没有运行时要求,你只需编译生成的C ++代码并链接到某些共享库;结果是一个真正的编译可执行文件而不是包装器)。这个功能在MATLAB 7发布时完全changed(原因是旧方法只支持MATLAB语言的一个子集,而使用当前的MCR机制可以部署几乎任何代码)。多年以后,MATLAB添加了一个新产品来取代曾经删除的代码转换功能,即MATLAB Coder