MATLAB函数转成C#可用的函数(dll形式)

标签:
c |
分类: 软硬件学习 |
Part 1. MATLAB转C#函数
一、MATLAB函数转dll(MATLAB 7.11.0(R2010b),VS2010,WIN7X64)
(1)将用到的函数用MATLAB编写*.m文件,如下图所示:
http://s9/bmiddle/002XXC9mgy6OaA2giQEa8&690
(2)在MATLAB的command window输入deploytool,按回车键,出现Deployment Project 窗口,输入工程名称(它相当于c#中的命名空间namespace),选择.NET 程序集。
http://s8/bmiddle/002XXC9mgy6OaA3KjEbc7&690
(3)点击“Add Class”添加一个类(它就是c#中的类),之后再给它添加方法(它就是函数了),点[add files],如下图所示。
http://s6/bmiddle/002XXC9mgy6OaA5f7RHf5&690
(4)最后点击生成按钮,可以看出在工程文件夹下的distrib子文件夹下出现了myerf.dll。
http://s6/bmiddle/002XXC9mgy6OaA7XvHn95&690
(5)最后将MWArray.dll(在C#中,必须引入mwarray.dll才能拥有在.net中进行矩阵运算所需要的一切)和myerf.dll都拷贝出来,放到C#程序的bin/Debug文件夹内。
Part 2. C#调用MATLAB生成的*.dll
(1)分别将拷贝到bin/Debug文件夹内的dll文件添加到工程引用中,如下图所示:
http://s9/bmiddle/002XXC9mgy6OaAae7cA58&690
(2)添加头文件
usingMathWorks.MATLAB.NET.Arrays;//在MWArray.dll,最常用的
usingMathWorks.MATLAB.NET.Utility;// 在MWArray.dll,最常用的
using myerf;//这个就是自己定义的,里面有matlab函数
(3) 函数调用
a)
b)
基于上面两点,首先,要弄清楚MATLAB参数类型,包括值和矩阵的参数
类型的确定;其次,要明白dll中的函数返回值的类型;最后,要了解这些值类型间的转换关系和方法。
(4)C#输入数值转换为MATLAB识别的数据类型,在MATLAB中,一个m*n的矩阵对应.net中的一个1*(m*n)的数组。
(5)C#类型转换为MATLAB类型
如果是数值:
1)直接将值传递给已经初始化的MWArray数组中的成员
2)直接将数据类型赋值给已经初始化的MWNumericArray变量。
3)直接将字符串类赋值给已经初始化的MWCharArray变量。
如果是数组类型:
1)直接赋值给MWNumericArray变量;
2)赋值给MWArray变量,则在前面加上类型转换如:(MWNumericArray)进行强制转换。
总之,MWArray是总类型,其它的以MW开头,以Array结尾的变量类型都可以直接对它进行赋值或取值。
(6)M类型到C++/C#数据类型
1)MWArray
M类型,它是M文件的编译后内部的标准类型,一切C++/C#类型都要最终转换成此类型,方可作为参数调用M语言函数。
2)MWCharArray
M的字符串类型,使用它可以将M中的字符类型转换成C++/C#的字符串类型。
3)MWNumericArray
MWNumericArray是MWArray与C#等语言的转换中间类型。
(7)常用的转换函数:
① public Array ToArray(MWArrayComponent component);
将M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。
② public byte ToScalarByte();
将M类型转换成C#的字节类型;
③ public double ToScalarDouble();
将M类型转换成C#的双精度类型;
double temp = ((MWNumericArray)(mwArgout[0])).ToScalarDouble();
④ public float ToScalarFloat();
将M类型转换成C#的单精度类型;
⑤ public int ToScalarInteger();
将M类型转换成C#的整型类型;
⑥ public long ToScalarLong();
将M类型转换成C#的长整C/C++/C#数据型类型;
⑦ public short ToScalarShort();
将M类型转换成C#的短整型类型;
⑧ public override string ToString();
将M类型转换成C#的字符串类型;string arror = mwArgout[2].ToString();
⑨ public Array ToVector(MWArrayComponent component);
将M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。
(8)多参数输入和多参数返回的问题
//输入这里想传入的2个输入参数,为了支持矩阵好通用,所以得弄成Array
//这些参数都是矩阵
MWNumericArray ma = new MWNumericArray(3, 2, a);
//转换成matlab需求的格式
//输出参数是一个MWArray数组
//两个输出参数,一定要写数量
//调用函数,输出参数需要加 ref 关键字
//2表示输入参数的个数,输出结构都在argsOut中,类似于c的指针参数输入
//转换得到实际的输出参数
//一定要注意最后c和d的转化,不同类型的转换差异很大厄
//ToArray()对应n*m的数组
//ToScalarDouble()对应单个数值
//ToVetor()对应1维数组
Part
3 运用实例代码
代码实例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Runtime.InteropServices;
usingMathWorks.MATLAB.NET.Arrays;
usingMathWorks.MATLAB.NET.Utility;
usingmyerf;
namespace ERFdll
{
}
Part
4 移植性问题的解决方法
matlab与c#混合编程的程序,如果要运行于客户的机子,必须在客户端的机子上设置好系统变量,同时需要安装.netframwork与MCR。.netframwork大家都很熟悉了,任何一个.net设计出来的程序,都不能脱离.netframwork而独立运行。独立的.netframwork组件包可以直接去微软的网站上去找。
MCR是由matlab提供的,它和.netframwork的性质相同,任何一个运行matlab的电脑上,都必须安装该组件。该组件在matlab2006a版本中已经分离开而成为一个独立的可运行的.exe文件。它一般是放在 //MATLAB/R2006a/toolbox/
compiler/deploy/win32文件夹中,名MCRInstaller.exe。该组件其实是将//MATLAB/R2006a/bin/win32文件夹下的大部分(注意不是全部).dll文件打包而已。这也是为什么有些程序在安装了MCR的机子上仍然不能运行的原因,不过对绝大多数的程序来说,一个MCR就足够了。比较保险的办法是,自行将//MATLAB/R2006a/bin/win32下的所有文件打包成一个安装文件,安装完后设置好系统变量(也就是在class变量下添加上面文件的路径)。
为了让用户安装程序时不需要太多的操作,我们可以把上面2个组件和应用程序一起打包,然后写个脚本检测客户端的机子是否已经安装了上面的2个组件,如果没有,则提示用户安装。检测脚本的写法很多地方都可以找到。这里就不多介绍了。