C#.Net与MATLAB集成

在数学分析工具方面,MATLAB无疑是佼佼者,除了作为软件工具外,MATLAB的自定义编程语言以及混合编程的支持,使其可以与Python、R之类数学分析语言媲美。尤其是在一些传统领域的研究,由于其研究领域的专业性,研究人员一般是该专业科班出身,而计算机则是副业,因此MATLAB的应用要远比Python和R广泛。

MATLAB拥有众多的算法包,.Net平台下的F#是用于数据分析的语言,但相比较而言,MATLAB的算法更多,计算效率更高,而且MATLAB的绘图能力很强;另一方面,MATLAB在传统的UI界面、程序功能控制、系统软件集成等方面略逊,因此将C# WinForm等与MATLAB结合起来,实现高效、便捷、集成的数学分析是一个很好的解决方案,而MATLAB的混合编程则可以支持该方案的实现。

MATLAB的混合编程,即将MATLAB平台(软件、计算引擎、DCOM服务、命令行接口等)与C#.Net等平台结合起来,分别负责某部分功能,相互传递数据和命令,共同实现数据分析。MATLAB与C#.Net实现混合编程的方式有两种,一种是将MATLAB脚本编译为.Net程序集(dll),然后C#.Net引用该程序集实现数据分析;另一种是C#调用MATLAB执行MATLAB脚本(m文件),也就是俗称使用MATLAB引擎的方式。

两种集成方式各有优缺点,例如编译为.Net程序集,受限于.Net程序集版本等,且需要编译后使用,不利于版本更新;直接调用MATLAB引擎,则需要安装MATLAB软件。选择何种集成模式,可根据具体需求、场景确定。网上有不少关于方案一的说明,本帖就方案二的实现做一概要说明。

MATLAB平台提供了DCOM服务、命令行接口两种接口方式,网上一般可以看到DCOM服务的方式,该方式可以直接将命令字符串传递给MATLAB实例(根据MATLAB类型反射创建MATLAB实例),使用其Excute方法执行代码,并可以获取到返回值。次方法调用时,MATLAB将DCOM服务提供给调用者,因此执行过程和结果MATLAB程序不反馈,最终将输出结果反馈给调用者。

System.Type oType = System.Type.GetTypeFromProgID("Matlab.Application");
 object ostr = System.Activator.CreateInstance(oType);
 object results = oType.InvokeMember("Execute", BindingFlags.InvokeMethod, null, ostr, new object[] { data });

上述方式的一个缺点是,当MATLAB执行耗时或者出错时,不易排查,因为调用者仅能获取到执行结果,无法获取到MATLAB脚本中的debug、info等信息,因此适用于算法成熟、固定的场景。在算法灵活多变或者不成熟的情况下,跟踪脚本执行无疑是重要的,此时可采用方式二,即调用MATLAB命令行执行。

调用MATLAB命令行执行,MATLAB将启动应用程序,然后执行脚本,执行过程中的输出信息可以输出到命令窗口中,类似于分析人员执行使用MATLAB分析一样,只是其分析过程实现了集成、自动化。

 

 

posted @ 2017-12-09 10:56  马洪彪  阅读(834)  评论(0编辑  收藏  举报