目录:
1.将MATLAB的m文件形成.dll形式
2.将.dll组件插入到.net程序中
3.MATLAB程序与.net程序数据形式转换
4.常见问题
以我写的ELM文件为例,matlab是2010b版本。会出现常见错误的地方标红。1.将MATLAB的m文件形成.dll形式
(1)确保写好.m 文件。 m文件中最好无clear all等与MATLAB平台有关的语句。否面后面.net平台调用时会出错。 m文件定义好程序入口,如function Y=ELM(x,y);(返回一个输出) function [a,b,c]=ELM(x,y)(返回多个输出) m文件例子如下:function Y=ELM(P,T,P_tests)%输入训练集,训练结果,预测集(2)将m文件形成.dll组件形式 在command window里写“deploytool”回车
%clear all//这些注释掉,调用会出错
%clc
%训练模型
%tic
[IW,B,LW,TF,TYPE]=elmtrain(P,T,10,'sig',1);
%toc
%测试模型
%tic
Y_test=elmpredict(P_tests,IW,B,LW,TF,TYPE);
%toc
Y=Y_test;
出现下图,在“Name”里定义工程名称,“Location”是保存的地址,“Target”中选择“.NET Assembly”,转换成.net组件。点击“OK”
出现下图。点击“Add class”,将默认名“Class1”改为你想要的名字,但是与之前写的工程的名称不要相同。并在“Add files”下添加.m文件需要的子m文件。比如我的ELM程序中用到elmtrain.m,elmpredict.m.而下方的“Add file/directories”中可以添加数据库和其他的.m文件。会有读者出错是因为程序识别不出.m的某个文件。都可以在此处添加。
此处还需要注意的是保存的project的要与你写的.net的Framework兼容。点击"Project"——"Settings"——".NET"标签,在“Microsoft Framework”中选择适合的选项。选完后直接“close”就可以。点击红框内符号加载。等几分钟后加载完毕。形成两个文件,"ELM.prj"和ELM文件夹、
2.将.dll组件插入到.net程序中
打开Visual studio,在项目下的“引用”添加刚才形成的.dll文件。可以在ELM文件夹的“distrib”中找到。同时将用于matlab与.net数据转换的“MWArray”添加上。其路径为“ C:\ProgramFiles\MATLAB\R2010b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll”(每个人的路径略有不同)
接下来使用命名空间,在程序的 using 区域内添加以下两个 using:
using ELM;
using MathWorks.MATLAB.NET.Arrays;
3.MATLAB程序与.net程序数据形式转换
首先将要输入的数据(DataSet形式等)转换成二维或多维数组。为Array[,]而非Array[][]的形式。我尝试过将double[][]数组作为输入,结果出错。比如代码中的double[,] data形式是正确的。然后我们要把这个.NET 中的二维数组转化成 MWArray 的中间类型,因为 Matlab 生成的函数接收的是 MWArray 类型的数据,MWArray 是 Matlab 与.NET 进行数据交换的中间类型。这里我们定义的是 MWNumericArray 类型,它是从 MWArray 派生的类型,在传递参数的时候同样可用。之后很关键的一个问题就是如何把 double[,]转换成MWNumericArray 了,这里非常简单,只需要在实例化 MWNumericArray 的时候将 data 作为 MWNumericArray 构造函数的参数就行了。 把MWNumericArray 类型的结果转成double[,]的结果。直接调用 MWNumericArray 的 ToArray 方法。//matlab与.net数据类型转换注意的是如果需要输入字符串怎么办?Matlab中的字符串都是以单引号表示,C# 中是双引号。其实与上方一样。调用MWCharArray的构造函数即可。
//double[,] data = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } };
//MWNumericArray Array_train = new MWNumericArray(data);
MWNumericArray Array_train = new MWNumericArray(dt_train);
MWNumericArray Array_test = new MWNumericArray(dt_test);
MWNumericArray Array_trainResult = new MWNumericArray(trainResult);
//调用MATLAB的dll组件
elm elmModel = new elm();
MWNumericArray resultArray;
resultArray = (MWNumericArray)elmModel.ELM(Array_train, Array_trainResult, Array_test);
//将结果转换成数组
double[,] result = (double[,])resultArray.ToArray();
MWCharArray function = new MWCharArray("sig");
elmModel.Saveelmtrain(Array_train, Array_trainResult, 10, function, 1, name);
我还遇到的问题是我需要保存ELM跑出的模型,而且跑出的模型名称由前台用户输入。所以模型名称是变量。这里用到的matlab中的save和Load函数。具体如下:Name作为输入,将返回的多个输出值保存到Name.mat里
function [IW,B,LW,TF,TYPE]=Saveelmtrain(P,T,N,TF,TYPE,Name)加载模型的m文件:
%内容省略
save(Name,'IW','B','LW','TF','TYPE');
function Y=Loadelmpredict(P,Name)
%可以分别求出各个值,但是如果要使用这些值,要把这些值(struct形式)转换成cell,cell再转换成数值形式。比较麻烦 % IW=load(Name,'-mat','IW'); % LW=load(Name,'-mat','LW'); % B=load(Name,'-mat','B'); % TF=load(Name,'-mat','TF'); % TYPE=load(Name,'-mat','TYPE');
%这种方法简单,但是模型名称是常量 % load Name IW LW B TF TYPE
%这种方法是我需要的,Name是变量。如果想为常量,写成‘模型名’即可。 load(Name,'IW','LW','B','TF','TYPE')