加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2014-12-06 14:50:53)
标签:

c

分类: 软硬件学习

Part 1. MATLABC#函数

一、MATLAB函数转dllMATLAB 7.11.0(R2010b)VS2010WIN7X64

1)将用到的函数用MATLAB编写*.m文件,如下图所示:

http://s9/bmiddle/002XXC9mgy6OaA2giQEa8&690

2)在MATLABcommand 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)       c#的参数输入到matlab函数时,要将参数转化为matlab的参数形式,通常是MWArray类型。

b)      matlab返回的参数,也要转化为c#用的类型,比如数组或者数值类型。

基于上面两点,首先,要弄清楚MATLAB参数类型,包括值和矩阵的参数

类型的确定;其次,要明白dll中的函数返回值的类型;最后,要了解这些值类型间的转换关系和方法。

4C#输入数值转换为MATLAB识别的数据类型,在MATLAB中,一个m*n的矩阵对应.net中的一个1*m*n)的数组。

5C#类型转换为MATLAB类型

如果是数值:

1)直接将值传递给已经初始化的MWArray数组中的成员

2)直接将数据类型赋值给已经初始化的MWNumericArray变量。

3)直接将字符串类赋值给已经初始化的MWCharArray变量。

如果是数组类型:

1)直接赋值给MWNumericArray变量;

2)赋值给MWArray变量,则在前面加上类型转换如:(MWNumericArray)进行强制转换。

总之,MWArray是总类型,其它的以MW开头,以Array结尾的变量类型都可以直接对它进行赋值或取值。

6M类型到C++/C#数据类型

1MWArray

M类型,它是M文件的编译后内部的标准类型,一切C++/C#类型都要最终转换成此类型,方可作为参数调用M语言函数。

2MWCharArray

M的字符串类型,使用它可以将M中的字符类型转换成C++/C#的字符串类型。

3MWNumericArray

MWNumericArrayMWArrayC#等语言的转换中间类型。

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

            double[] a = { 1, 2, 3, 4, 5, 6 };//输入参数1

            double[] b = { 2, 4, 6, 8, 10, 12 };//输入参数2

            double[,] c = new double[3, 2];//输出参数1

            double[,] d = new double[3, 2];//输出参数2

//这些参数都是矩阵

MWNumericArray ma = new MWNumericArray(3, 2, a);

//转换成matlab需求的格式

            MWNumericArray mb = new MWNumericArray(3, 2, b);

//输出参数是一个MWArray

            MWArray[] agrsOut = new MWArray[2];

//个输出参数,一定要写数量

 //输出几个输出参数可以是不同类型的,比如第一个元素是矩阵,第二个是数值

 //同理,输入参数也是一个MWArray数组

            MWArray[] agrsIn = new MWArray[] { ma,mb};

//调用函数,输出参数需要加 ref 关键字

            myFun.MatrixOpera(2, ref agrsOut, agrsIn);

//2表示输入参数的个数,输出结构都在argsOut中,类似于c的指针参数输入

//转换得到实际的输出参数

            MWNumericArray x1 = agrsOut[0] as MWNumericArray;

            MWNumericArray x2 = agrsOut[1] as MWNumericArray;

                      c = (double[,])x1.ToArray();

                      d = (double[,])x2.ToArray();

//一定要注意最后cd的转化,不同类型的转换差异很大厄

//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

{

    class Program

         

        static void Main(string[] args)

        {

 

            double x=1;

            double r=1;

            double y;

            erf a = new erf();

            MWArray X = (MWNumericArray)x;

            MWArray R = (MWNumericArray)r;

            MWArray Y= a.myerf(X,R);

            y = (double)(Y.ToArray()).GetValue(0, 0);

            Console.WriteLine("y={0}", y);

       

        }

   

    }

}

 

 


 

Part 4  移植性问题的解决方法

matlabc#混合编程的程序,如果要运行于客户的机子,必须在客户端的机子上设置好系统变量,同时需要安装.netframworkMCR.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个组件,如果没有,则提示用户安装。检测脚本的写法很多地方都可以找到。这里就不多介绍了。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有