如何在visual studio的.net程序中调用matlab程序
来源:互联网 发布:淘宝合伙开店协议书 编辑:程序博客网 时间:2024/06/05 00:11
目录:
1.将MATLAB的m文件形成.dll形式
2.将.dll组件插入到.net程序中
3.MATLAB程序与.net程序数据形式转换
(1)确保写好.m 文件。
m文件中最好无clear all等与MATLAB平台有关的语句。否面后面.net平台调用时会出错。
m文件定义好程序入口,如function Y=ELM(x,y);(返回一个输出) function [a,b,c]=ELM(x,y)(返回多个输出)
在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的某个文件。都可以在此处添加。
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 方法。
我还遇到的问题是我需要保存ELM跑出的模型,而且跑出的模型名称由前台用户输入。所以模型名称是变量。这里用到的matlab中的save和Load函数。
具体如下:
Name作为输入,将返回的多个输出值保存到Name.mat里
(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“等语句去掉。
1.将MATLAB的m文件形成.dll形式
2.将.dll组件插入到.net程序中
3.MATLAB程序与.net程序数据形式转换
4.常见问题
以我写的ELM文件为例,matlab是2010b版本。会出现常见错误的地方标红。
(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
- 如何在visual studio的.net程序中调用matlab程序
- 为何我不能在我的VISUAL STUDIO .NET中创建ASP.NET项目(程序)
- 如何在Visual Studio 2005 中封装制作安装程序
- 在 Visual C++/Native 代码中调用.NET 程序集
- 在java程序中调用matlab程序
- 初学者的福音——在Visual studio中使用Azure例子程序(.NET)
- 如何在Visual Studio 2005中创建用于移动设备(PDA)的安装程序
- 如何在Visual Studio 2005 中开发ISO 的c++ 程序
- 如何:在 Visual Studio 中添加或移除引用自己的程序集
- 在Visual Studio中写python程序
- 在Visual Studio中调试程序的命令行参数传递
- 在visual studio中使用共享程序集的方法
- 在Visual Studio中编写基于ffmpeg的helloworld程序
- 在VC6.0下面如何调用matlab的程序
- 在C程序中调用Matlab功能
- 在Java程序中调用Matlab函数
- 在Matlab中调用C语言程序
- 在Java程序中调用Matlab函数
- linux下生成动态链接库.so
- chart画图的用法
- openstack 手动迁移虚机的过程
- 数据结构之线性表1概括
- matlab读取多张图片
- 如何在visual studio的.net程序中调用matlab程序
- 对话机器学习大神Yoshua Bengio(下)
- ICT中国.2014高层论坛暨Testin云测移动开发者分论坛9月24日开启
- DBus应用的俩种形态及实现
- Android 发送邮件mail
- MySQL四大索引基础知识
- Redis 的安装配置介绍
- java的静态变量,静态代码块和静态变量
- 使用get方法提交form表单时出现乱码解决方法