2014-01-22 38 views
3

我有一个很好的.net程序集的核心matlab函数,当然是用matlab编译器创建的。对于接受数字或数组数组的函数,这没问题;我可以在C#中编写代码,而无需恢复到matlab(嗯,RCM必须安装;这很好)。将matlab函数集成到c#项目中

但是,对于那些必须引用其他函数的函数,我至今可以找到一个获取c#程序的唯一方法就是将这两个函数编译到程序集中。为了更好地解释,假设我有一个库,其中存储了ode45例程。如果我想解决一个特定的公式,让我们说一些简单的像DY/DX = -y,然后我要创建可写的MATLAB脚本文件,如下所示:

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

[明显的解析解存在,但为了这个例子,让我们说我想要这样解决]

现在为了解决这个等式,我将不得不添加此函数作为我的类中的一个方法来编译到.net部件。这当然会破坏我的图书馆的普遍性;我需要将不同库中的特定于应用程序的方程式与我的核心数学函数库进行比较。也就是说,ODE45方法应该位于比“difffeq”方法所在的库更“核心”的库中。我更喜欢在c#类中创建“diffeq”方法,我可以直接在例如编辑器中编辑这些方法。 VS2012。我想直接编辑公式,而不是每次都输入matlab并重新编译程序集。

为了解决这个问题,我已经到了包含ode45代码和我的微分方程方法的程序集反编译的程度;原来这个程序集只不过是与MCR的接口;在装配diffeq方法返回类似以下的东西:

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

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

这引出了一个问题:“老兄,这里是我的功能?”

还有就是组件的“资源”部分中,我们发现[类名] .ctf,并在我们会发现一些机器代码。这看起来是加密的,但公式可能隐藏在那里。如果是这样,那将是我尝试阻止的故意尝试,并且对MathWorks的赞扬使我无法避免输入matlab应用程序!

但是,似乎没有任何许可证可以阻止我想要做的事情;我认为,如果数学作品能够让人们接受这样的方法,那将是非常棒的,但是在这个环节中,有没有人知道如何做到这一点?

回答

1

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

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

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

有一个在deploytoolmcc -C)选项告诉编译器不嵌入二进制作为资源里面的CTF存档,而不是把它作为一个单独的文件旁边生成的二进制(这CTF归档可以检查作为普通的ZIP文件,但里面的源文件仍然是加密的)。

有关更多信息,请参见下面的文档页面:

Application Deployment Products and the Compiler Apps


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

+0

所以你说,正常的MATLAB代码可以在程序运行时访问临时文件夹内? –

+0

对不起,我的措辞有点模棱两可,提取的文件保持加密形式(AES加密)。我想MCR知道秘密的对称密钥,因此能够解密然后照常执行代码。有趣的是,只有M文件被加密了(还有其他的资源文件和来自你的''prefdir''的包含在CTF档案中的未加密的首选项)。目录结构使用相同的文件名进行复制,但M文件中的内容基本上是乱码。 – Amro