MATLAB运行速度快、计算效率高,拥有强大的工具箱,如果能将matlab函数引用到VS中,是一个相当节省代码量的事,对广大码农而言无疑是一个福音。
传统.net与MATLAB的接口有如下几种:(来自文献基于C#.net与MATLAB接口和BP网络的汽车产量预测,作者黄一丹)
(1)利用Matlab自身编译器,目的是将m文件转换为c或c++的源代码。
(2)利用COM或.NET组件技术。通过MATLAB中的Deploy
tool工具将m文件编译成dll,然后在系统中调用。
(3)利用Mideva平台。没尝试过。
(4)利用MATLAB引擎技术。该方法相当于在.NET中运行MATLAB程序,获取其结果。优点是操作简单,过程简易。缺点是需要安装Matlab软件。
我之前研究过C#和matlab的混编,比喻说通过.net调用matlab灰色系统函数,采用的是上述方法(2),结果也很理想。无奈调用神经网络却各种不成功,困扰了好久吗,最后发现官网上提示通过混编的方式无法实现神经网络,如果能实现,那大家可以随意盗用神经网络函数。终于让我找到了方法4,重新看到了希望,最后在好兄弟的帮助下,终于拿下了纠结已久的问题。现小结一下,供自己和大家参考。
过程如下:
1、在.NET中添加MATLAB计算引擎。
右键工程,添加COM引用,名称为“Matlab
Application(Version 7.14)Type
libaray”,7.14是自己的版本号,不同系列的软件版本号不同。这样在引用中会看到一个名为MLApp的文件,选择该文件,将属性Embed
Interop Types的True值改为False。如果不更改,会提示cannot embed。
2、准备m函数。这个自然需要,注意保证该函数的正确性。
3、接口实现。
计算引擎有三个主要函数,分别是PutFullMatrix,表示存储数据;Execute,执行函数;GetFullMatrix,获取结果。具体事例如下。我的函数是:function
BPNN_R=BPNN(data,check_yearnum,forecast_yearnum)。Demo链接:http://pan.baidu.com/s/1kT3Nk15
MLAppClass matlab = new MLAppClass();
//原始数据
double[,] data ={
{1996,218197},
{1997,284265},
{1998,289669},
{1999,298027},
{2000,300544},
{2001,298070},
{2002,301406},
{2003,299896},
{2004,306110},
{2005,310860},
{2006,312530},
{2007,332530},
{2008,324835},
{2009,330565},
{2010,337024},};
double[,] dataIm = new double[15, 2];
//训练数据年份,例如近两年数据作为检测
double[] check_yearnum = { 2 };
double[] check_yearnumIm = { 0 };
//预测未来几年数据。
double[] forecast_yearnum = { 3 };
double[] forecast_yearnumIm = { 0 };
matlab.PutFullMatrix("data", "base", data,
dataIm);//第一个data表示存储的数据,第二个参数表示工作空间,第三个参数data表示输入数据的实部,第四个参数表示输入数据的虚部
matlab.PutFullMatrix("check_yearnum", "base", check_yearnum,
check_yearnumIm);
matlab.PutFullMatrix("forecast_yearnum", "base", forecast_yearnum,
forecast_yearnumIm);
string path_project =
Directory.GetCurrentDirectory(); //工程文件的路径,如bin下面的debug
string path4_matlab = "cd('" + path_project +
"')"; //自定义matlab工作路径
matlab.Execute(path4_matlab); //改变matlab当前路径
matlab.Execute(@"BPNN_R = BPNN(data, check_yearnum,
forecast_yearnum)");
// matlab.Execute(@"BPNN_R1=pwd"); //获取matlab当前路径
System.Array prresult = new double[15,
5]; //我的结果是15*5的矩阵
System.Array piresult = new double[15, 5];
//object path2=null;
//
matlab.GetWorkspaceData("BPNN_R1", "base", out
path2); //可以通过该函数查看工作空间
matlab.GetFullMatrix("BPNN_R", "base", ref prresult, ref
piresult); //结果存放在prresult中
matlab.MinimizeCommandWindow();//最小化matlab command窗口
matlab.Quit();//关闭Matlab服务器
注意:很多人(包括我在内)很容易在获取结果时出现以下错误,原因是Maltab的M函数路径不对,系统找不到我们编写的函数。
具体的位置可以通过代码控制,string path_project =
Directory.GetCurrentDirectory(); 这表示在工程的bin/Debug文件下,如果采用该代码,需要将m函数放在这个路径下。当然你也可以自己通过其他函数指定路径。主要是通过以下两句代码更改路径并执行切换。
string path4_matlab = "cd('" + path_project +
"')"; //matlab的默认路径
matlab.Execute(path4_matlab); //改变matlab运行路径