C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力。在此以一个小例子的形式给大家讲述一下二者混合编程的实现。

  

  一、软件的配置说明

  C#版本:VS2010 matlab版本:matlab2013a

  二、把 matlab函数编译成dll文件 

  2.1首先写一个函数的.m文件(如下函数MatrixOpera实现两个矩阵的相加和相减)

%--------------------------------------------------------function [addRlt,minusRlt]=MatrixOpera(a,b)% 矩阵相加,相减[m1,n1]=size(a);[m2,n2]=size(b);if m1~=m2 || n1~=n2    display('矩阵大小不相同')    error('参数错误');endaddRlt=a+b;minusRlt=a-b;end%-----------------------------------------------------------

 

  2.2 创建制作的dll文件的工程

  在MatLab的命令窗口中,输入deploytool打开创建dll文件的工程创建窗口,如下图所示

  

  在图中,主要分为三部分,Name:你想要命的工程名,PRj是工程的后缀;Location:创建工程的储存位置;Type:针对c#而言,我们需要选择.NET Assembly这一项

  点击Ok选项,工程已经创建完毕

  2.3 向所建工程中添加对应的元素并编译

  上述过程中,新建了一个叫matPrj的工程(它相当于c#中的命名空间namespace);然后给它增加class(它就是c#中的类),点[add class]添加myMathClass;之后再给它添加方法(它就是函数了),点[add files],本实例中选中之前编写的MatrixOpera函数。完了之后就可以编译了,编译需要一两分钟的时间,如下图所示

  

  三、C#中添加matlab的dll引用

  3.1打开vs2010,新建一个窗体应用程序

  

  3.2完成dll文件的拷贝

  将matlab工程(matPrj)src文件夹下的matPrj.dll和D:\Program Files\MATLAB\R2013a\toolbox\dotnetbuilder\bin\win64\v2.0(前边为matlab的安装路径)文件夹下的MWArray.dll拷贝到VS工程(CallMatlabDllApp)下的\bin\Debug文件夹下

  

  3.3在VS里添加dll文件的引用,然后在代码前引用相应的命名空间

  

  

    

  

  如果matlab函数复杂,还需要用到其他的空间,则视情况而定,自己凭经验添加。

  至此,已经可以利用c#调用我们用matlab编写的函数了。

  四、在C#中调用matlab提供的函数

  matlab中一个m*n的矩阵对应.net中的一个1*(m*n)的数组,因此在C#中调用matlab函数的关键是掌握数据类型一致的一个矩阵与一个数组之间的转换。包括以下两个问题:

  a、将C#中的参数输入到matlab函数时,要将参数转化为matlab的参数形式,通常是MWArray类型

b、matlab函数返回的参数,也要转化为C#用的类型,比如数组或者数值类型

  在C#中调用本例函数的代码如下:

            matPrj.myMathClass test = new matPrj.myMathClass(); //将myMathClass类实例化            double[] a = { 1, 2, 3, 4, 5, 6 };//定义两个输入参数            double[] b = { 1, 1, 1, 1, 1, 1 };//它们是两个一维静态数组            double[,] c = new double[3, 2];//定义C#中接收输出参数的类型            double[,] d = new double[3, 2];//是两个二维数组            //把两个输入参数都转换成中间类型,中间类型也是矩阵所以要指明维数            //这里将两个输入参数转换为两个三行两列的矩阵            MWNumericArray matlab_a = new MWNumericArray(3, 2, a);            MWNumericArray matlab_b = new MWNumericArray(3, 2, b);            //输入参数成功转化为两个MWArray元素类型            MWArray[] agrsIn = new MWArray[] { matlab_a, matlab_b };            //声明输出参数是两个MWArray元素类型,一定要写数量            MWArray[] agrsOut = new MWArray[2];            //调用matlab函数,2表示输出参数的个数,输出参数前需要加 ref 关键字            //此例实现了两个三行两列的矩阵相加减            test.MatrixOpera(2, ref agrsOut, agrsIn);            //把两个输出参数转换成中间类型            MWNumericArray net_c = agrsOut[0] as MWNumericArray;//matlab函数第一个输出参数            MWNumericArray net_d = agrsOut[1] as MWNumericArray;//第二个输出参数       //转换成C#中的接收参数            c = (double[,])net_c.ToArray();//转化为二维数组            d = (double[,])net_d.ToArray();            //一定要注意最后接收参数的转化,不同类型的接收参数用的转换函数不同            //二维数组用ToArray()函数转换            //一维数组用ToVector(MWArrayComponent.Real)函数转换            //单个double值用ToScalarDouble()函数转换       //单个int值用ToScalarInteger()函数转换            for (int i = 0 ; i <= 2; i++)//输出结果验证            {                for (int j = 0; j <= 1; j++)                {                    textBox1.Text += c[i, j].ToString() + " ";                    textBox2.Text += d[i, j].ToString() + " ";                }                textBox1.Text += "\r\n";//换行                textBox2.Text += "\r\n";            }            

  MWNumericArray是MWArray与C#等语言数据转换中间类,实现C#与matlab函数间传递参数的功能

  MWArray是总类型,其它的以MW开头,以Array结尾的变量类型都可以直接对它进行赋值或取值,它是.m文件的编译后内部的标准类型,一切C#类型都要最终转换成此类型,方可作为参数调用matlab函数

  

  我在运行上述程序时,第一句将myMathClass类实例化报错

  但是单看这语句是没有任何问题的

  matPrj.myMathClass test = new matPrj.myMathClass();

  查阅了关于错误的信息,但是解决的都基本是换了一个matlab版本才解决的,偶然看见说HRESULT:0x8007000B的错误和编译平台有些关系,就开始着手试试是不是因为我这平台的问题导致的,果然,换了编译的平台就好了。

  具体解决:

  1:右键项目名称—>属性—>生成

  2:目标平台选择x64(因为我的matlab2013a是64位的

再次运行程序,结果如下:

上述结果同下图在matlab中实现效果相同,验证结果的正确性

  由于我的项目中其他引用是32位软件生成的,为保重整个系统的各个模块能同时工作,我重下了个32位的matlab2012a重新生成dll文件实现同样的功能,C#项目程序不变,目标平台改回x86(同时因为通常情况下,为保证我们的程序既能在64位机子上运行,也能在32位机子上运行,我们的目标平台也会选择x86),重复上述步骤进行操作,发现最后运行程序时再一次出现与之前相同的错误

  

  很明显还是matlab版本的问题,但我的C#项目的目标平台已经是x86,上网查找各种资料,有的说是因为matlab中被编译的.m文件和编译生成的工程所在路径上有中文,改之,问题未解决;有的说要重现装一下MCR(MATLAB Compiler Runtime),装之,问题未解决;有人接着说装完MCR后还要把他的路径增加到环境变量path中,加之,问题未解决(后来发现这些做法根本就是多此一举,系统安装matlab时就已经安装了MCR,而MCR在安装成功后,路径会被系统自动添加到环境变量中)。加上反反复复的安装和卸载matlab共花费了大约2~3天的时间,问题仍然没解决,正当我对人生充满疑惑时,一次偶然的机会(直接运行打包后的程序),我看到了错误的信息是matlab引用与配置文件信息(2.13.0.0)不相符,我马上找到了工程下的配置文件app.config,打开后果然发现里边的配置信息有2.13.0.0的字眼,这很明显是我最开始使用matlab2013a与C#混编时自动写入的,而现在我换成了matlab2012a,与配置文件中的版本信息不相符,所以报错,找到了问题所在,就容易解决了:把app.config中matlab版本信息2.13.0.0改成2.12.0.0,问题解决!

  脱离matlab安装的环境下,如何实现程序的运行自如:

  通过com组建的形式进行混合编程,如果机器上没有安装MATLAB,编译生成的软件照样可以使用,但是需要安装MATLAB提供的MATLAB Compiler Runtime(MCR),这个软件在MATLAB的安装目录下:X:\MATLAB\R2013a\toolbox\compiler\deploy\win32\MCRInstaller.exe(X是MATLAB安装的盘符),如果你的电脑上安装了MATLAB,则不需要在重新安装这个软件。另外,不同的MATLAB版本提供的MATLAB Compiler Runtime可能会不同,如果在另一台电脑上自己编写的软件运行有问题,可能是编译器的版本不同引起的

参考资料:http://wenku.baidu.com/link?url=mgBBgQFt89s-7rKrNbJ-630AH0q_2mMMYBbvCWx9IiGkuOQ7qFTkL_pZRhT5FqazmtFoD6UUM6vWLeDrprF2OAGqUcmrHEugVntjWvzCwxy

     http://www.cnblogs.com/liuxiaowei0543/p/3682377.html

     http://wenku.baidu.com/view/6ad3b62b59eef8c75fbfb3ed.html

C#与MATLAB混合编程的更多相关文章

  1. C++和MATLAB混合编程-DLL

    先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件 ...

  2. java matlab混合编程之返回值Struct类型

    java matlab混合编程的时候当返回值是Struct类型(matlab中的返回类型)如何来取得(java中)其值? 上网找,看到这个网页:http://www.mathworks.cn/cn/h ...

  3. WPF(C#)与MATLAB混合编程

    WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...

  4. VC 与Matlab混合编程之引擎操作详解

    Visual C++ 是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快.但在科学计算方面函数库显得不够丰富.读取.显示数据图形不方便. Matlab 是一款将数值分析.矩阵计算.信 ...

  5. VS/Qt C++和Matlab混合编程

    最近两天在搞C++和Matlab混合编程,这个中间过程真是让人心酸啊,最后还是搞定成功!现在把这个过程记录一下. 首先自己的电脑本来就安装着matlab2013b,按着网上的说法首先需要输入!mcc, ...

  6. C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

  7. matlab混合编程向导(vc,vb,.net...)

    一.matlab与vc混编  1.通过mcc将matlab的m文件转化为cpp,c文件或dll供vc调用:     这方面的实现推荐精华区Zosco和ljw总结的方法(x-6-1-4-3-1和2)  ...

  8. Matlab混合编程

    Matlab混合编程 混合编程目的 在Matlab中采用混合编程目的主要包括 利用已有的函数库,避免重复工作 加速计算,特别是减少循环所用时间 利用GPU等进行异构编程 混合编程方法-mex函数 目前 ...

  9. C#Matlab混合编程类 初始化问题解决方法

    ************** 异常文本 ************** System.TypeInitializationException: “myPlus.matClass”的类型初始值设定项引发异 ...

  10. 国内第一部C#.Net调用Matlab混合编程视频教程

       本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录:[目录]Matlab和C#混合编程文章目录 一.视频说明 2014年的5.1,我将这套视频教 ...

随机推荐

  1. 安装 Oracle P6 EPPM 16 R1 database for 12C

    . 打开命令提示符(Windows)或 终端(如果UNIX)和连接数据库使用以下命令: sqlplus sys/password@dbservicename as sysdba 连接到: sqlplu ...

  2. 【C#】OOP之继承那点事

    前言: 继承这点事,说多不多,说少不少,这里只描述了一些我认为的基础篇,望各位大神指教.本节参照了C#高级编程和Think in java对继承的描述,我个人认为OOP只是思想,故看明白一个就说通的, ...

  3. C#获取url中参数键值对的方法

    方法如下: /// <summary> /// 遍历Url中的参数列表 /// </summary> /// <returns>如:(?userName=keley ...

  4. c#图片添加水印

    今天讲一个上传图片添加水印的方法,直接上代码吧 protected void Button1_Click(object sender, EventArgs e)    {        int loc ...

  5. SqlServer 2008 R2定时备份数据库,并且发送邮件通知

    先配置数据库的邮件设置,这样才可以发送邮件. 2. 3. 4. 5. 6. 7. 8. 9. 10. 总的预览图,如图 执行这一段(先发送备份邮件,然后进行数据备份,将昨天的发送数据插入到另一张表中, ...

  6. 雷军V5,米3横空出世

    小米3 下午两点,小米CEO:雷军(也是一个传奇人物),虽然没购买门票,只是自己一个人看微博,看新闻,还是了解到了小米3的面貌,这次雷哥还给大家带来了MITV,售价¥2999!(无法相信)顶配.这次我 ...

  7. windows下react-native环境搭建

    首先不得不先吐槽一下自己,一个坑总是踩很多次,且乐此不疲. 咋办? 写博客记录记录呗. 零.记录的点 Java环境的下载与配置 Android环境的下载与配置 Node环境的下载与配置 创建第一个re ...

  8. 通过代码的方式完成WCF服务的寄宿工作

    使用纯代码的方式进行服务寄宿 服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境.通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用, ...

  9. Codeforces Round #346 (Div. 2)---E. New Reform--- 并查集(或连通图)

    Codeforces Round #346 (Div. 2)---E. New Reform E. New Reform time limit per test 1 second memory lim ...

  10. Mysql denied for user 'odbc@localhost' || denied for user 'root@localhost'

    1. Question Description: 1.1  mysql  version:  mysql-5.7.11-win64.zip 1.2  if you connect to the mys ...