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

一、软件的配置说明

C#版本:VS2010;MatLab版本:MatLab2011a

二、制作matLab的C# dll文件

2.1首先写一个M文件(实现你想要的函数执行形式)

以网上down了一个M文件(实现基本的绘图功能),内容见下表,

  1. function test(h,D)
  2. for x=-10:0.1:10,
  3. if x>D
  4. y=h;
  5. hold on;
  6. plot(x,y)
  7. elseif x<-D
  8. y=-h;
  9. hold on;
  10. plot(x,y)
  11. else
  12. y=h/(D*x);
  13. hold on;
  14. plot(x,y)
  15. end
  16. end

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

在MatLab的命令窗口中,输入deploytool,或者利用菜单选项,file-new-deployment project打开创建dll文件的工程创建窗口,如下图所示。

在图中,主要分为以下三部分,Name:你想要命名的名字,prj是工程的后缀(一般不忽略);location:创建工程的储存位置;type:针对c#而言,我们需要选择.net assembly这一项;点击Ok选项,工程已经创建完毕。下一步就是向工程中加入你想要的方法等元素。

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

上述过程中,就相当于在C#中创建了Untitled2的命名空间,需要在此添加对应的类和方法。基于上述的例子,下一步,我们在窗体菜单中  destop-.netAssembly-点击选择,见下图所示。

在上面Classes是你自己对应编写了一个类,然后向里面添加Add files,也就是你之前编写的M文件,经过编译之后,就在对应的工程文件中,形成你所需要的dll文件。下一步我们如何在C#中利用对应的dll文件。

三、如何在C#中利用Matlab制作的dll文件

3.1首先,将matlab中对应的刚编写好的untitled的dll文件,同时从C:\Programs\Files\MatLab\R2011a\toolbox\dotnetbuilder\bin\win64\v2.0中拷贝出MWArrary.dll和ManagedCPPAPI.netModule三个文件拷贝到C#编写的工程文件中去,C#编程文件的debug文件中。在这里特别说明的一点是:最后一个文件在matlab2011a中没有找到对应的文件,发现并不影响程序的执行。

3.2在C#的工程中,我们在引用中----添加对彼此dll文件的引用。见下图

3.3命名空间的引用 using.....的书写

using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using Untitled1;

四、最后,在C#中如何引用这些matlab提供的计算模块的功能实现

 4.1 在C#中调用MatLab的函数是最重要的是函数变量之间的传递是如何实现的?

包括以下几个问题:a、将C#的参数带入到matLab的函数的参数中,将C#的参数转化成对应的MWArray类型。

b、如何将Matlab函数返回的类型,转化成C#对应的函数类型。

 4.2 MWNumericArray是MWArray和c#中数据的中间类,实现C#与matlab间传递参数的功能

a.double型、int型等数值类型的变量传递

MWNumericArray i = null, result = mydouble;

i=4;

myClass myclass = new myClass(); //实例化

result = (MWNumericArray)myclass.myfunc(i);

b.字符串(需要用到MWCharArray和MWArray转换)

MWCharArray FileName = myString;

MWNumericArray sensitivity;

sensitivity = (MWNumericArray)myClass.myAlgorithm((MWArray)FileName);

c.多个输出参数组成的数组

MWNumericArray out_Arr = (MWNumericArray)out_Args[1]; //取出第一个参数返回的数组(matlab返回的数组下界是从1开始的)

取出数组中的一个元素值

mydouble=out_Arr[i].ToScalarDouble();

如上面例子ToScalarDouble一类的toXXXX等方法还有许多。

d.result.toArray可以把matlab返回的矩阵变成C#的n x m数组,eg:

double[,] csArray= (double[,])result.ToArray(MWArrayComponent.Real);

e.将数组传入Matlab(和传递单个数值的方法一样)

double[,] dbx = new double[2, 2] { { 1, 2 }, { 3, 4 } };

MWNumericArray x=dbx;

myclass.picture(x);

  1. testz.testzclass st = new testz.testzclass();
  2.  
  3. MWArray[] max = st.testz(2);
  4.  
  5. MWNumericArray x1 = (MWNumericArray)max[0];
  6.  
  7. MWNumericArray x2 = (MWNumericArray)max[1];
  8.  
  9. double[,] location1 = (double[,])x1.ToArray(MWArrayComponent.Real);
  10.  
  11. double[,] location2 = (double[,])x2.ToArray(MWArrayComponent.Real);
  12.  
  13. label1.Text = location1[1,2].ToString();
  14.  
  15. 其中的M文件:
  16.  
  17. Code
  18.  
  19. function [x1,x2]=testz()
  20.  
  21. x1=[1 2 3;
  22.  
  23. 4 5 6;
  24.  
  25. 7 8 9;];
  26.  
  27. x2=[9 8 7;
  28.  
  29. 6 5 4;
  30.  
  31. 3 2 1;]

常用的转换函数:

① 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类型,然后可以直接转换成其它类型的数组。

下面使用调试过的代码示例表述①⑨两个函数的区别:

double[,] Temp1 = new double[1,3];

Temp1= (double[,])((MWNumericArray)mwArgout[1]).ToArray(MWArrayComponent.Real);

double[] s1 = new double[2];

s1 = (double[])((MWNumericArray)mwArgout[1]).ToVector(MWArrayComponent.Real);

从以上代码可以看出:函数①得到了二维数组,而⑨则是得到了一维数组。转换成C++/C#数据类型后,它们的维数均为从0开始。

最后总结:

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

此方向转换十分简单。

如果C++/C#数据不是数组,

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

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

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

如果是数组类型:

直接赋值给MWNumericArray变量;

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

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

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

MWArray

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

MWCharArray

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

MWNumericArray

MWNumericArray是MWArray与C#等语言的转换中间类型。

上述整理参考了文献出自http://zxfcool2000.blog.163.com/blog/static/31852320101117111555598/

在实现过程中遇到的问题:

错误信息:“未能加载文件或程序集“MWArray, Version=2.11.1.0, Culture=neutral, PublicKeyToken=e1d84a0da19db86f”或它的某一个依赖项。试图加载格式不正确的程序。”

解决方案:将C#项目属性从x86->x64就行了

补充一个例子的应用:

M文件:

  1. function [x1,x2]=test(x3)
  2. x1=[1 x3*x3 x3;
  3. 1-x3 5 6;
  4. 7 8 9;];
  5. x2=[9 8 7;
  6. 6 5 4;
  7. 3 2 1;];

在C#中形成的几种函数形式如下:

public MWArray test();
        public MWArray[] test(int numArgsOut);
        public MWArray test(MWArray x3);
        public MWArray[] test(int numArgsOut, MWArray x3);
        public void test(int numArgsOut, ref MWArray[] argsOut, MWArray[] argsIn);

所以在C#中可以选择不同的形式调用,其中numArgsOut指的是输出参数的个数  argsOut:输出参数,当然尽管C#中泛泛提出了几种函数形式,确只有第3,4,5是可以使用的(结合自己写的M文件内容)

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

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

C#和MatLab的混合编程(充分利用二者的优势)的更多相关文章

  1. 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...

  2. Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)

    原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...

  3. Matlab.NET混合编程调用Figure窗体

    原文:[原创]Matlab.NET混合编程调用Figure窗体 1.前言 做Matlab.NET混合编程好几年了,虽然Matlab很多函数忘记得差不多了,但基本的东西还是能熟练使用.特别是在C#调用M ...

  4. Matlab.NET混合编程技巧之——找出Matlab内置函数

    原文:[原创]Matlab.NET混合编程技巧之--找出Matlab内置函数 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破 ...

  5. 【原创】Matlab.NET混合编程技巧之找出Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.N ...

  6. 基于引擎的matlab+vc混合编程的配置

    前段时间在项目中做了一些关于基于引擎的vc+matlab混合编程的工作. 如果你是混合编程新手,我相信使用引擎的方式编程是比较简单快捷的一种方式. 当然这种方法也有其缺点,就是不能脱离matlab运行 ...

  7. VS2008与MATLAB R2007a混合编程配置过程

    系统平台:windows xp sp2, visual studio 2008 professional, matlab R2007a 首先,为了使matlab 能够找到vs2008编译器,需要下载以 ...

  8. matlab c# 混合编程

    MWArray错误: matlab 64位 vs 32位 1. visual studio没有专门的64位版.但32位版可以在64位系统上面正常使用.2.安装VS2010的时候,在安装选项里面,选择了 ...

  9. Visual Studio 与 Matlab实现混合编程

    环境: Win10 vs2010 Matlab2015 里面有很多选做的内容,其中2.3必做 1.Matlab环境设置:   (选做)我没有做这步,因为打mbuild -setup指令不识别,缺少SD ...

随机推荐

  1. Spring boot profile 多环境配置

    1.多Profile文件 我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml 默认使用application.properties的配置 ...

  2. 1 python 文件处理

    1.打开文件open 函数 open函数最常用的使用方法如下:文件句柄 = open('文件路径', '模式',编码方式). encode='' 1.关于文件路径 #文件路径: 主要有两种,一种是使用 ...

  3. HTTP状态码 解析

    原文地址:HTTP状态码:400500错误代码(个人总结)作者:lining2008net 一些常见的状态码为: 200-服务器成功返回网页 404-请求的网页不存在 503-服务不可用 详细分解: ...

  4. 在JSP页面中显示动态时间

    源地址:http://blog.csdn.net/aitcax/article/details/41285305 静态时间: 1.页面首部添加 <%@page import="java ...

  5. SQL Server - 最佳实践 - 参数嗅探问题 转。

    文章来自:https://yq.aliyun.com/articles/61767 先说我的问题,最近某个存储过程,暂定名字:sp_a 总是执行超时,sp_a带有一个参数,暂定名为 para1 var ...

  6. python 本地变量和全局变量 locals() globals() global nonlocal 闭包 以及和 scala 闭包的区别

    最近看 scala ,看到了它的作用域,特此回顾一下python的变量作用域问题. A = 10 B = 100 print A #10 print globals() #{'A': 10, 'B': ...

  7. 疯狂JAVA——第四章 流程控制与数组

    4.5 数组类型 数组也是一种类型.它本身是引用类型.例如int是一种基本类型,int[]就是引用类型. 两种定义数组的方式: 1.type[] arrayName; 2.type arrayName ...

  8. git hg提交拉取

    工作总结web_acl 535 git clone “ssh://git@outergit.yonyou.com:49622/esn_web/web_acl.git" 600 git bra ...

  9. date.getTime()

    Date date = new Date(); System.out.println(date.getTime()); 输出结果是1210745780625 编译时间当时时间大概是2008年5.14好 ...

  10. 无插件,无com组件,利用EXCEL、WORD模板做数据导出(一)

    本次随笔主要讲述着工作中是如何解决数据导出的,对于数据导出到excel在日常工作中大家还是比较常用的,那导出到word呢,改如何处理呢,简单的页面导出问题应该不大,但是如果是标准的公文导出呢,要保证其 ...