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

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

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

然而,对于必须引用其他函数的函数,到目前为止我能找到的使 C# 程序运行的唯一方法是将这两个函数编译到程序集中。为了更好地解释,假设我有一个库,其中存储了 ode45 例程。如果我想求解一个特定的方程式,比如说像 dy/dx = -y 这样简单的方程式,那么我必须创建一个 matlab 脚本文件,它可以这样写:

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

[显然解析解存在,但为了这个例子,假设我想这样解决]

现在为了求解这个等式,我必须将这个函数作为方法添加到我的类中以编译到 .net 程序集中。这当然会破坏我图书馆的通用性;我希望在与我的核心数学函数库不同的库中使用特定于应用程序的方程式。也就是说,ODE45 方法应该位于比“diffeq”方法所在的库“更核心”的库中。

不仅如此,我更愿意在我可以直接编辑的 c# 类中创建“diffeq”方法,例如VS2012。我想直接编辑方程式,而不是每次都进入 matlab 并重新编译程序集。

为了解决这个问题,我已经反编译了包含ode45代码和我的微分方程方法的程序集;事实证明,该程序集只不过是 MCR 的一个接口(interface);程序集中的 diffeq 方法返回如下内容:

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

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

这引出了一个问题“老兄,我的函数在哪里?”

程序集中有一个“资源”组件,我们可以在其中找到 [classname].ctf,并且我们会在其中找到一些机器代码。这看起来是加密的,但方程式可能隐藏在其中。如果是这样,那将是我在尝试时故意阻止的尝试,并且感谢 MathWorks 让我无法避免进入 matlab 应用程序!

但是,似乎没有任何许 cocoa 以阻止我想做的事情;我认为,如果 mathworks 允许采用如此开放的方法,那就太好了,但在此期间,有人知道如何做到这一点吗?

最佳答案

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

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

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

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

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

Application Deployment Products and the Compiler Apps


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

关于c# - 将matlab函数集成到c#项目中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21282885/

相关文章:

c# - 这个安全警告是什么意思(.Net Process 类)?

Matlab:如何在我的例程中接收函数(如 exp)作为参数?

matlab - 在不同状态序列长度的 MATLAB 中估计马尔可夫链转移矩阵

c# - 如何通过比较两个 c# 对象来创建 JsonPatchDocument?

c# - 如何在可移植类库中使用 wcf 服务并想在 xamarin 中的共享项目(我正在使用 Xamarin.Forms Portable)中添加引用?

c# - 在 Metro 应用程序中显示动画 GIF

c# - 使用 c# 从 Panasonic PBX 捕获数据

.NET 和 AMF

c# - C#.net循环线程堆栈溢出

c - 在 MATLAB mex 文件中使用外部 BLAS 和 LAPACK 库