猪冰龙

导航

matlab2016b和c# .net4.0混合编程

 参考:https://www.cnblogs.com/eniac12/p/4390845.html

 

 

 

 

 

 

主要想用c#写软件界面,利用matlab绘图,或者用里面的遗传算法。

我的环境是:Win10 64位系统+Microsoft Visual Studio 2013+MATLAB2016b,其中用到的框架是.NET4.0。要把vs2013安装好,c#也要安装(好像c#是vs安装必选项,安装了vs也就安装了c#了),matlab2016b完全破解安装。

好了,废话不多说,先上图:

就是简单的循环计算,把结果输出到lable的txt中。

 结果:

步骤:

1.先说说环境配置

70%的人就卡在这儿了。首先我们需要知道matlab和c#混合编程可以分为两大类:引擎方式(从c#向matlab引擎发matlab命令http://blog.sina.com.cn/s/blog_6f7265cf0101nqhw.html和.net组件方式(c#调用matlab的dll,http://blog.sina.com.cn/s/blog_6f7265cf0101nqm1.html)。我着重讲第二种。

主要是借鉴别人的,只不过可能稍微详细点。

 

1.1 配置matlab

首先输入:    mbuild -setup  ,之后点击c++的那个,我也不知道为啥与c#混合编程没有c#的选项,只有c++的,我就选了

若出现未找到支持的编译器或sdk请移步:http://blog.csdn.net/hy5468/article/details/52705874

之后输入:mex -setup   ,回车,还选择c++

 若是找不到编译器可以参考:http://blog.sina.com.cn/s/blog_6f7265cf0101nqm1.html

安装MinGW-w64 C/C++ 编译器:链接:https://pan.baidu.com/s/1jHPuahw 密码:rxj4,MATLAB2016b选择4.9.2的,帮助说:

You can use the MinGW-w64 version 4.9.2 compiler from TDM-GCC to build MEX files and standalone MATLAB® engine and MAT-file applications.

 

To install the compiler, use the Add-Ons menu. Search for MinGW or select from Features.

“”

mingw w64 安装问题 https://zhidao.baidu.com/question/1382951261644564380.html

官方下载的安装程序
architecture i686 或者 x86_64 
threads posix或者win32 posix或者win32 
exception dwarf或者sjlj seh或者sjlj
我是win7 64位电脑该如何选

 

试着回复下;
1、i686 与 行x86_64这个好理解,既然下载的是MinGW-w64,当然就要选x86_64,否则下载Mingw的纯32就行了。
2、如果没有跨平台编译需求,就选win32。如果有的话选posix。
3、dwarf、sjlj 的异常模型选择,推荐使用dwarf即所谓dw2,这个模型便于调试。不过出来的东西较sjlj的东西体量稍大些。

问题:matlab在关联编译器的时候,会出现找不到编译器的问题

原因:matlab要找windows sdk的mt.exe,找不到报错的.因为vs2013在安装时,windows sdk的mt.exe位置变了,而matlab还是按照老的路径找,肯定找不到(原来在windows sdks下面,现在在windows kits下面).

解决:网上找到相应文件,将mbuildopts和mexopts两个文件夹复制到 (matlabroot)\bin\win64 下,(matlabroot)是matlab的安装目录

 

在command window中>>deploytool。先创建project,选择.NET Assembly类型;然后把myplus.m文件添加到project里面,然后点上面菜单条上的build the project,

 

 环境安装及dll注册

若安装了matlab就不用安装运行时环境了,否则要安装环境。

需要安装MCRinstaller.exe(本机则不需要),它所在的位置是:C:\Program Files\MATLAB\R2013a\toolbox\compiler\deploy\win64;

在路径C:\Program Files\MATLAB\R2013a\bin\win64里,对mwcomutil.dll进行注册(这个dll是matlab下作的任何com组件都要用到的dll),下面我们在其他编译器下调用时就可以用了。regsvr32 mwcomutil.dll

问题:提示错误为注册dll模块的原因(Error: DllRegisterServer in E:\Matlab2010b\bin\test\src\test_1_0.dll failed)

解决:点"开始"->"Windows系统"->"命令提示符"右键"以管理员身份运行",

win10中可以windows+x:

在cmd中输入regsvr32 mwcomutil.dll 。这样应该就可以了。

这里需要说明一下,通过 D:  这个命令可以切换到d盘,然后输入dll所在路径(可以粘贴路径  cd +绝对路径路径比如 cd D:\Program Files\MATLAB\R2016b\bin\win64)就可以注册了。

 

2.写matlab代码

先在matlab里写一个函数,注意保存后文档名要和函数名一致,为myplus.m,这是因为matlab中调用函数是根据文档名调用的(其实函数名和对应的文档名不一致也行,但会在函数名下划波浪线线警告,另外路径中不能有空格和中文,最好自己单独建立一个文件,我就在安装目录下建立了一个myproject文件)

1 function [s] = myplus( n )
2 % calculate the sum of 1..n
3 s = 0;
4 for i = 1:n
5      s = s + i;
6 end
matlab代码

按照上面的方式编译成dll后:

箭头所指的myplus.dll就是将来我们要用的dll,要放在c#工程的bin/debug目录下并引用。

 

3.c# 建立窗体程序

matlab2016b好像最高支持.net4.0,所以此处选择4.0框架。

然后添加一个button和一个label控件:

双击建立好的button控件

输入一下代码:

1             Class1 myhello = new Class1();
2             MWArray i = 3;
3             MWArray result;
4             result = myhello.myplus(i);
5             label1.Text = result.ToString();

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10 
11 using MathWorks.MATLAB.NET.Arrays;
12 using MathWorks.MATLAB.NET.Utility;
13 using myplus; 
14 
15 namespace WindowsFormsApplication1mexmatlab
16 {
17     public partial class Form1 : Form
18     {
19         public Form1()
20         {
21             InitializeComponent();
22         }
23 
24         private void button1_Click(object sender, EventArgs e)
25         {
26             Class1 myhello = new Class1();
27             MWArray i = 3;
28             MWArray result;
29             result = myhello.myplus(i);
30             label1.Text = result.ToString();
31 
32         }
33 
34         private void label1_Click(object sender, EventArgs e)
35         {
36 
37         }
38 
39         private void Form1_Load(object sender, EventArgs e)
40         {
41 
42         }
43     }
44 }
双击button后界面所有代码

记得里面要有这三个引用:

 1 using MathWorks.MATLAB.NET.Arrays; 2 using MathWorks.MATLAB.NET.Utility; 3 using myplus;  

 

然后再途中右上角 “引用”处右键添加引用,浏览,添加D:\Program Files\MATLAB\R2016b\toolbox\dotnetbuilder\bin\win64\v2.0\MWArray.dll和matlab编译生成的myplus.dll,最好先把这两个dll复制到这个c#的bin\debug文件夹下再添加引用。

 

 

这时还可能在Class1那儿出错,我又在项目上右键,

 

 

之后就成功啦。


接下来在dll中再添加一个绘图函数。一个dll可以添加多个函数,在这个dll中也可以建立多个类,比如Class1、Class2,每个类下面也可以有多个函数,被称为方法。下图中一个class中有连个方法。

 

将生成的dll复制到debug文件夹中,在窗口界面新建一个button2,然后双击这个buttoon,在里面写代码:

  1 Class1 myhello2 = new Class1(); 2 myhello2.drawtest(); 

 


再加一个矩阵计算(参考:https://www.cnblogs.com/eniac12/p/4390845.html 内有代码):

 1 %--------------------------------------------------------
 2 function [addRlt,minusRlt]=MatrixOpera(a,b)
 3 % 矩阵相加,相减
 4 [m1,n1]=size(a);
 5 [m2,n2]=size(b);
 6 if m1~=m2 || n1~=n2
 7     display('矩阵大小不相同')
 8     error('参数错误');
 9 end
10 addRlt=a+b;
11 minusRlt=a-b;
12 end
13 %-----------------------------------------------------------

 

编译matlabdll

 

将新编译出来的dll放入c#的debug文件下。

 

下面设计c#界面:添加textbox空间勾选上Multiline,

添加一个button3,双击进去添加代码,因为和参考的文章中类名不同,所以c#中带稍作修改:

 1  private void button3_Click(object sender, EventArgs e)
 2         {
 3             Class1 test = new Class1(); //将myMathClass类实例化
 4 
 5             double[] a = { 1, 2, 3, 4, 5, 6 };//定义两个输入参数
 6             double[] b = { 1, 1, 1, 1, 1, 1 };//它们是两个一维静态数组
 7 
 8             double[,] c = new double[3, 2];//定义C#中接收输出参数的类型
 9             double[,] d = new double[3, 2];//是两个二维数组
10 
11             //把两个输入参数都转换成中间类型,中间类型也是矩阵所以要指明维数
12             //这里将两个输入参数转换为两个三行两列的矩阵
13             MWNumericArray matlab_a = new MWNumericArray(3, 2, a);
14             MWNumericArray matlab_b = new MWNumericArray(3, 2, b);
15 
16             //输入参数成功转化为两个MWArray元素类型
17             MWArray[] agrsIn = new MWArray[] { matlab_a, matlab_b };
18 
19             //声明输出参数是两个MWArray元素类型,一定要写数量
20             MWArray[] agrsOut = new MWArray[2];
21 
22             //调用matlab函数,2表示输出参数的个数,输出参数前需要加 ref 关键字
23             //此例实现了两个三行两列的矩阵相加减
24             test.MatrixOpera(2, ref agrsOut, agrsIn);
25 
26             //把两个输出参数转换成中间类型
27             MWNumericArray net_c = agrsOut[0] as MWNumericArray;//matlab函数第一个输出参数
28             MWNumericArray net_d = agrsOut[1] as MWNumericArray;//第二个输出参数
29 
30             //转换成C#中的接收参数
31             c = (double[,])net_c.ToArray();//转化为二维数组
32             d = (double[,])net_d.ToArray();
33             //一定要注意最后接收参数的转化,不同类型的接收参数用的转换函数不同
34             //二维数组用ToArray()函数转换
35             //一维数组用ToVector(MWArrayComponent.Real)函数转换
36             //单个double值用ToScalarDouble()函数转换
37             //单个int值用ToScalarInteger()函数转换
38 
39             for (int i = 0; i <= 2; i++)//输出结果验证
40             {
41                 for (int j = 0; j <= 1; j++)
42                 {
43                     textBox1.Text += c[i, j].ToString() + " ";
44                     textBox2.Text += d[i, j].ToString() + " ";
45                 }
46                 textBox1.Text += "\r\n";//换行
47                 textBox2.Text += "\r\n";
48             }
49         }
button3中代码,从Class1开始哦

也成功啦,见下图:

 

 


http://blog.csdn.net/zwjabcd/article/details/50663134

https://www.mathworks.com/help/dotnetbuilder/MWArrayAPI/html/T_MathWorks_MATLAB_NET_Arrays_MWNumericArray.htm

 并结合https://www.cnblogs.com/liuxiaowei0543/p/3682377.html  就差不多理解两种语言之间数据的转换了。

 


 

 

参考:

http://blog.sina.com.cn/s/blog_6f7265cf0101nqm1.html

https://www.cnblogs.com/liuyikang/articles/4189631.html

http://blog.csdn.net/liu16659/article/details/52442435

MATLAB与c#混合编程:
HAO:http://blog.csdn.net/zwjabcd/article/details/50588432
改正错误:http://www.cnblogs.com/zoro-zero/p/5867320.html
 
我们一般用net组件方式,即调用matlab的dll:http://blog.sina.com.cn/s/blog_6f7265cf0101nqm1.html
mbuild:https://www.cnblogs.com/liuyikang/articles/4189631.html
 
不错:http://www.cnblogs.com/sorex/archive/2012/08/01/2617469.html
 
另一种不太好,直接调用matlab引擎,发给命令:http://blog.sina.com.cn/s/blog_6f7265cf0101nqhw.html

 

posted on 2017-12-21 11:28  猪冰龙  阅读(682)  评论(0编辑  收藏  举报