C#和MatLab的混合编程(充分利用二者的优势)
C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力。在此以一个小例子的形式给大家讲述一下二者混合编程的实现。
一、软件的配置说明
C#版本:VS2010;MatLab版本:MatLab2011a
二、制作matLab的C# dll文件
2.1首先写一个M文件(实现你想要的函数执行形式)
以网上down了一个M文件(实现基本的绘图功能),内容见下表,
function test(h,D)
for x=-10:0.1:10,if x>Dy=h;hold on;plot(x,y)elseif x<-Dy=-h; hold on;plot(x,y)elsey=h/(D*x);hold on;plot(x,y)end
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);
testz.testzclass st = new testz.testzclass();MWArray[] max = st.testz(2);MWNumericArray x1 = (MWNumericArray)max[0];MWNumericArray x2 = (MWNumericArray)max[1];double[,] location1 = (double[,])x1.ToArray(MWArrayComponent.Real);double[,] location2 = (double[,])x2.ToArray(MWArrayComponent.Real);label1.Text = location1[1,2].ToString();其中的M文件:Codefunction [x1,x2]=testz()x1=[1 2 3;4 5 6;7 8 9;];x2=[9 8 7;6 5 4;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文件:
function [x1,x2]=test(x3)
x1=[1 x3*x3 x3;1-x3 5 6;7 8 9;];
x2=[9 8 7;6 5 4;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可能会不同,如果在另一台电脑上自己编写的软件运行有问题,可能是编译器的版本不同引起的
转载于:https://www.cnblogs.com/liuxiaowei0543/p/3682377.html
C#和MatLab的混合编程(充分利用二者的优势)相关推荐
- Matlab.NET混合编程调用Figure窗体
原文:[原创]Matlab.NET混合编程调用Figure窗体 1.前言 做Matlab.NET混合编程好几年了,虽然Matlab很多函数忘记得差不多了,但基本的东西还是能熟练使用.特别是在C#调用M ...
- qt web混合编程_基于Qt与MATLAB的混合编程技术
摘要:在Qt雷达仿真系统中,数据处理及图形显示尤为重要.本文为此提出了一种Qt与MATLAB混合编程的方法.通过VC++和MATLAB混合编程技术,将MATLAB函数封装成动态链接库,Qt调用这个动态 ...
- 利用Matcom实现基于MATLAB的混合编程
利用Matcom实现基于MATLAB的混合编程 来源: 神经网络 作者:AI俱乐部 网友评论 0 条 浏览次数 42 <script> remark_look('re_look.php?c ...
- 基于引擎的matlab+vc混合编程的配置
前段时间在项目中做了一些关于基于引擎的vc+matlab混合编程的工作. 如果你是混合编程新手,我相信使用引擎的方式编程是比较简单快捷的一种方式. 当然这种方法也有其缺点,就是不能脱离matlab运行 ...
- matlab混合编程设置,matlab c++ 混合编程初始设置
以前做过matlab7与c++的混合编程:将m函数编译成dll给C++调用,从而加快开发的进度.但是今天在matlab2008b 下面又做了一遍,发现matlab又改了很多东西,诸如增加了面向对象的的 ...
- matlab r2012a win10,vs2010和Matlab R2012a 混合编程
注:Matlab r2010b及以后版本才支持vs2010, 之前版本中mbuild命令输入后可能会找不到vs2010编译器. 2.书写m文件 示例如下: function [ c ] = MyAdd ...
- Matlab C++混合编程 在VisualStudio下的编程 使用了Opencv库
某工程上需要在matlab上使用c++版本的opencv,之前使用的是版本配置是matlab2018和vs2018,而现在使用的是matlab2016和vs2015,不同matlab版本的调用c++代 ...
- VS2012和matlab 2010b混合编程之环境配
VC调用matlab Matlab是一个强大的数学计算/仿真工具,其内置了很多实用的现成的函数,而且我们经常也自己定义很多m函数.但在很多情况下,我们不得不使用VC编程.那么,如何在VC中利用matl ...
- Qt 调用MATLAB引擎混合编程
0.前言 C/C++调用MATLAB有三个方式:调用dll文件.调用exe可执行程序和调用Engin引擎. 第一种方式利用MATLAB Coder 将MATLAB代码生成C/C++代码和相关动态链接库 ...
- Matlab C混合编程
设置编译器路径 在Matlab 命令窗口键入 mex -setup,下面只要根据提示一步步设置就可以了. 为了测试你的路径设置正确与否,把下面的程序存为hello.c. [cpp] view p ...
最新文章
- Steve J. Luck推出最新ERPs独家视频课程
- openssl qt linux 安装,在Ubuntu 16.04.1上使用OpenSSL构建Qt失败
- 电压放大倍数公式运放_运放电路:同相放大还是反相放大?
- 用python做自我介绍_python入门教程NO.2 用python做个自我介绍
- 阿里工程师养了只“二哈”,专治讨厌的骚扰电话
- nginx 中location和root,你确定真的明白他们关系?
- 618期间, “直播带货”翻车负面信息暴增
- Element-UI + Vue.js + SpringBoot 实现前后端分离入门项目
- Media Player Classic - HC 源代码分析 1:整体结构
- jieba的一些使用
- 多时相地图瓦片简单设想
- 使用stream给list集合排序
- java压缩JPG 、PNG图片
- 数据库增删改查的基本操作和SpringBoot创建
- IOI 2011 Tropical Gardens Race Ricehub
- 8本好书上新:越忙越要多读书 1
- 利用npn开关电路,将stm32 IO口输出的0-3.3v的pwm波转换为0-5v的pwm波
- Unicode双向算法详解(bidi算法)(三)
- 计算机硬件故障注入,容错箭载计算机的硬件故障注入方法研究.pdf
- 大萧条时期让企业起死回生的5个秘诀|请转发给你的老板
热门文章
- React Native 生成 released apk图片不显示
- Nyoj Fire Station
- gulp教程之gulp-minify-css
- 在Spinnaker中创建微服务部署管道
- 2d isometric 坐标变换
- 04.spring boot配置文件--yml
- openlayers2 开发如何判断一个marker所在的点是否在一个多边形内部
- url后面的参数是什么_揭秘亚马逊黑科技之超级URL原理
- android底部显示不出来,Android studio 底部的状态栏不见了如何显示
- my sql 触发器_My SQLServer 触发器