matlab引擎常用调用函数,C#通过MATLAB引擎技术调用神经网络函数

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函数路径不对,系统找不到我们编写的函数。

a4c26d1e5885305701be709a3d33442f.png

具体的位置可以通过代码控制,string path_project =

Directory.GetCurrentDirectory(); 这表示在工程的bin/Debug文件下,如果采用该代码,需要将m函数放在这个路径下。当然你也可以自己通过其他函数指定路径。主要是通过以下两句代码更改路径并执行切换。

string path4_matlab = "cd('" + path_project +

"')"; //matlab的默认路径

matlab.Execute(path4_matlab); //改变matlab运行路径

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值