如何在visual studio的.net程序中调用matlab程序

来源:互联网 发布:淘宝合伙开店协议书 编辑:程序博客网 时间:2024/06/05 00:11
目录:
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文件例子如下:

1.function Y=ELM(P,T,P_tests)%输入训练集,训练结果,预测集  2.%clear all//这些注释掉,调用会出错  3.%clc                 4.%训练模型  5.%tic  6.[IW,B,LW,TF,TYPE]=elmtrain(P,T,10,'sig',1);  7.%toc  8.%测试模型  9.%tic  10.    Y_test=elmpredict(P_tests,IW,B,LW,TF,TYPE);    11.%toc  12.  Y=Y_test;  
(2)将m文件形成.dll组件形式
在command window里写“deploytool”回车
 
出现下图,在“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:\Program
Files\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 方法。
1.//matlab与.net数据类型转换  2.//double[,] data = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } };  3.//MWNumericArray Array_train = new MWNumericArray(data);  4.MWNumericArray Array_train = new MWNumericArray(dt_train);  5.MWNumericArray Array_test = new MWNumericArray(dt_test);  6.MWNumericArray Array_trainResult = new MWNumericArray(trainResult);  7.//调用MATLAB的dll组件    8.elm elmModel = new elm();  9.MWNumericArray resultArray;  10.resultArray = (MWNumericArray)elmModel.ELM(Array_train, Array_trainResult, Array_test);  11.//将结果转换成数组  12.double[,] result = (double[,])resultArray.ToArray();  
注意的是如果需要输入字符串怎么办?Matlab中的字符串都是以单引号表示,C# 中是双引号。其实与上方一样。调用MWCharArray的构造函数即可。

1.MWCharArray function = new MWCharArray("sig");  2.elmModel.Saveelmtrain(Array_train, Array_trainResult, 10, function, 1, name);  

我还遇到的问题是我需要保存ELM跑出的模型,而且跑出的模型名称由前台用户输入。所以模型名称是变量。这里用到的matlab中的save和Load函数。
具体如下:
Name作为输入,将返回的多个输出值保存到Name.mat里

1.function [IW,B,LW,TF,TYPE]=Saveelmtrain(P,T,N,TF,TYPE,Name)  2.%内容省略  3.save(Name,'IW','B','LW','TF','TYPE');  
加载模型的m文件:

1.%可以分别求出各个值,但是如果要使用这些值,要把这些值(struct形式)转换成cell,cell再转换成数值形式。比较麻烦  2.% IW=load(Name,'-mat','IW');  3.% LW=load(Name,'-mat','LW');  4.% B=load(Name,'-mat','B');  5.% TF=load(Name,'-mat','TF');  6.% TYPE=load(Name,'-mat','TYPE');  
4.常见问题
(1)未能加载文件或程序集“MWArray, Version=2.10.1.0, Culture=neutral,PublicKeyToken=e1d84a0da19db86f”或它的某一个依赖项。试图加。。。。。
如果引用路径没问题的话,考虑平台的兼容性问题。如果.NET平台是“X86”即32位(如何查看?选择项目中的“Properties”中的“生成”下的“目标平台“),则MWArray也需要是Matlab 32位下的组件。统一即可。
(2)"MathWork.MATLAB.NET.Arrays.MWNumericArray"的类型初始值设定发生异常
应该也是系统兼容问题,可通过平台是否都是32位或者都是64位入手。
(3)在调用MATLAB程序时,MATLAB内部程序报错
比如:"...MWMCR::EvaluateFunction error... Reference to a cleared variable p ".
考虑将Matlab中”Clear all“等语句去掉。




0 0
原创粉丝点击