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文件)
- function [s] = myplus( n )
- % calculate the sum of ..n
- s = ;
- for i = :n
- s = s + i;
- end
matlab代码
按照上面的方式编译成dll后:
箭头所指的myplus.dll就是将来我们要用的dll,要放在c#工程的bin/debug目录下并引用。
3.c# 建立窗体程序
matlab2016b好像最高支持.net4.0,所以此处选择4.0框架。
然后添加一个button和一个label控件:
双击建立好的button控件
输入一下代码:
- Class1 myhello = new Class1();
- MWArray i = ;
- MWArray result;
- result = myhello.myplus(i);
- label1.Text = result.ToString();
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using MathWorks.MATLAB.NET.Arrays;
- using MathWorks.MATLAB.NET.Utility;
- using myplus;
- namespace WindowsFormsApplication1mexmatlab
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- Class1 myhello = new Class1();
- MWArray i = ;
- MWArray result;
- result = myhello.myplus(i);
- label1.Text = result.ToString();
- }
- private void label1_Click(object sender, EventArgs e)
- {
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- }
- }
- }
双击button后界面所有代码
记得里面要有这三个引用:
using MathWorks.MATLAB.NET.Arrays; using MathWorks.MATLAB.NET.Utility; 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,在里面写代码:
Class1 myhello2 = new Class1(); myhello2.drawtest();
再加一个矩阵计算(参考:https://www.cnblogs.com/eniac12/p/4390845.html 内有代码):
- %--------------------------------------------------------
- function [addRlt,minusRlt]=MatrixOpera(a,b)
- % 矩阵相加,相减
- [m1,n1]=size(a);
- [m2,n2]=size(b);
- if m1~=m2 || n1~=n2
- display('矩阵大小不相同')
- error('参数错误');
- end
- addRlt=a+b;
- minusRlt=a-b;
- end
- %-----------------------------------------------------------
编译matlabdll
将新编译出来的dll放入c#的debug文件下。
下面设计c#界面:添加textbox空间勾选上Multiline,
添加一个button3,双击进去添加代码,因为和参考的文章中类名不同,所以c#中带稍作修改:
- private void button3_Click(object sender, EventArgs e)
- {
- Class1 test = new Class1(); //将myMathClass类实例化
- double[] a = { , , , , , };//定义两个输入参数
- double[] b = { , , , , , };//它们是两个一维静态数组
- double[,] c = new double[, ];//定义C#中接收输出参数的类型
- double[,] d = new double[, ];//是两个二维数组
- //把两个输入参数都转换成中间类型,中间类型也是矩阵所以要指明维数
- //这里将两个输入参数转换为两个三行两列的矩阵
- MWNumericArray matlab_a = new MWNumericArray(, , a);
- MWNumericArray matlab_b = new MWNumericArray(, , b);
- //输入参数成功转化为两个MWArray元素类型
- MWArray[] agrsIn = new MWArray[] { matlab_a, matlab_b };
- //声明输出参数是两个MWArray元素类型,一定要写数量
- MWArray[] agrsOut = new MWArray[];
- //调用matlab函数,2表示输出参数的个数,输出参数前需要加 ref 关键字
- //此例实现了两个三行两列的矩阵相加减
- test.MatrixOpera(, ref agrsOut, agrsIn);
- //把两个输出参数转换成中间类型
- MWNumericArray net_c = agrsOut[] as MWNumericArray;//matlab函数第一个输出参数
- MWNumericArray net_d = agrsOut[] as MWNumericArray;//第二个输出参数
- //转换成C#中的接收参数
- c = (double[,])net_c.ToArray();//转化为二维数组
- d = (double[,])net_d.ToArray();
- //一定要注意最后接收参数的转化,不同类型的接收参数用的转换函数不同
- //二维数组用ToArray()函数转换
- //一维数组用ToVector(MWArrayComponent.Real)函数转换
- //单个double值用ToScalarDouble()函数转换
- //单个int值用ToScalarInteger()函数转换
- for (int i = ; i <= ; i++)//输出结果验证
- {
- for (int j = ; j <= ; j++)
- {
- textBox1.Text += c[i, j].ToString() + " ";
- textBox2.Text += d[i, j].ToString() + " ";
- }
- textBox1.Text += "\r\n";//换行
- textBox2.Text += "\r\n";
- }
- }
button3中代码,从Class1开始哦
也成功啦,见下图:
http://blog.csdn.net/zwjabcd/article/details/50663134
并结合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
matlab2016b和c# .net4.0混合编程的更多相关文章
- matlab与VC6.0混合编程设置
版本matlab 2009 和vc++6.0 SP6 步骤 1) 配置环境,新建一个VC工程,然后在VC界面的“工具->选项”的目录选项卡中的“include”中加入如下路径: 2) D:\ ...
- Task Class .net4.0异步编程类
文章:Task Class 地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.tasks.task?view=netfra ...
- cocos2d 2.0和UIKit混合编程, Push CCDirector的时候出现黑屏的天坑
症状 使用cocos2d 2.0和UIKit混合编程, 有一块用cocos2d编写的小程序, 将CCDirector push到一个UINavigationController里面. 虽然事先在后台初 ...
- C#与C++的发展历程第三 - C#5.0异步编程巅峰
系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...
- 如玫瑰一般的PHP与C#混合编程
故事背景是这样的,有一套项目,服务器端是用C#写的,为了完成某种事情,它需要使用到一个组件,这个组件很小但很重要,很不巧的是,这个这个组件是用PHP语言写的,如果为了使用这个组件而专门搭建一个PHP的 ...
- C和C++混合编程中的extern "C" {}
引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: 1 2 3 4 5 6 7 8 9 #ifdef __cplusplus extern "C" { #endif ...
- C# 托管和非托管混合编程
在非托管模块中实现你比较重要的算法,然后通过 CLR 的平台互操作,来使托管代码调用它,这样程序仍然能够正常工作,但对非托管的本地代码进行反编译,就很困难. 最直接的实现托管与非托管编程的方法就是 ...
- 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...
- matlab和C/C++混合编程--调用opencv
最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然 ...
随机推荐
- easyui的dialog
代码: <div id="titledialos" class="easyui-dialog" title="×××" data-op ...
- JDK1.5 Excutor 与ThreadFactory
Excutor 源码解读: /** * An object that executes submitted {@link Runnable} tasks. This * interface provi ...
- android轮播图的实现原理
1.轮播图的点:RadioGroup,根据网络请求的数据,解析得到的图片的个数,设置RadioGroup的RadioButton的个数. 2.轮播图的核心技术:用Gallery来存放图片,设置适配器. ...
- fastjson的常用方法
/** * 解析对象形式的json字符串 */ public static void test1() { String jsonStr = "{\"JACKIE_ZHANG\&qu ...
- 13-linux定时任务不起作用到的问题解决办法
基本操作下面这篇: centos定时任务-不起作用- 没指明路径!!! 最大的问题是路径问题,以及权限问题. 用定时任务执行某些脚本是出现一系列问题,一步一步解决. 问题一:定时任务没反应: 查看日志 ...
- EntityFramework的linq扩展where
代码 using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; ...
- .netcore webapi 在startup中读取配置字符串
参考微软官方说明:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration 具体为: 读取方法见下图中标红的格式, ...
- C# CashCode项目开发
如果不是因为这个项目,我可以一辈子都接触不到识币器,更不会知道CashCode是干啥的. 从项目开始,到CashCode机器到桌面上测试,中间在网上找过资料,也联系过北京的技术,他们发来的PDF让我看 ...
- ubuntu16.04安装wps
下载: 我的电脑是64位的,所以选择64bit的deb包进行下载 1.下载地址:http://community.wps.cn/download/(去WPS官网下载) 安装: 2.执行安装命令:sud ...
- Android——Activity跳转
Activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayou ...