Matlab2013b和Visual Studio 2013混合编程总结

2023-05-16

 Matlab2013b和VisualStudio 2013混合编程总结

 

一、       关于软件版本和安装的说明

一般来说,Matlab版本需高于或者等于VisualStudio的版本。综合版本功能和兼容问题,我们选用了Matlab 2013b和Visual Studio 2013。 

Matlab2013b能够识别VisualStudio2012版本,前提是Visual Studio2012装在C盘默认目录。如果安装的是2013版本的话,Matlab无法识别,但是可以手动选择路径使得Matlab找到VS的编译器。详细的图文说明在第三部分说明。

二、       系统环境变量的设置

Computer -> Properties -> Advanced system settings ->Environment Variables -> User Variables -> path,添加Matlab2013b的安装路径:

…\MATLAB\extern\lib\win64\microsoft;

…\MATLAB\bin\win64

 

Computer -> Properties -> Advanced system settings ->Environment Variables -> System Varables -> path,添加路径:

…\MATLAB\runtime\win64;

…\MATLAB\bin;

…\MATLAB\extern\lib\win64\microsoft;

…\MATLAB\bin\win64;

 

三、       Matlab的设置以及DLL文件的生成

<一>Matlab的设置

在Matlab中设置编译器的时候,经过测试,存在两种情况。分别说明如下:

情况一:

>> mex –setup

>> y

如上所示,Matlab没有找到编译器。此时的问题可能是:1.没有安装SDK,在上面截图中的蓝色的网址中下载SDK并安装;2.没有安装Matlab2013b能识别的VS或者VS没有安装在默认文件夹。

如果是问题1则需要下载安装SDK

如果是问题2的话,则重新输入>>mex –setup然后选择n

如上图所示,Matlab弹出了它所支持的编译器,此时选择[18]或者其他MVC,然后弹出提示后,选择n,自己手动添加路径,添加VS2013的安装路径。

弹出提示后选择y。显示一下界面则是成功了。

 

接下来输入mbuild -setup,设置方法同mex –setup。

至此,Matlab 编译器设置完毕。

 

情况二:

只找到了matlab的编译器,没有找到vs的:

那么有两个解决方案,在C盘在安装一遍vs,或者是选择n然后跟情况一的问题2一样操作。最好最顺利的情况是按y有出现vs编译器。

<二>DLL文件的生成

1.首先编写.m文件并保存。

例如myadd2.m:

2.建立DeploymentProject

方法一:在matlab命令窗口输入 >> deploytool 弹出如下界面,选择ApplicationCompiler。

方法二:在Matlab菜单栏选择APPS,选择Application Compiler

 

选择Application Compiler后出现以下界面:

如图所示进行操作。这里需要注意的是,matPrj是matlab的Project名,同时也是生成的DLL文件名和C#中的命名空间名称,而maMathClass则是命名空间中的类名,MatrixOpera和myadd2则是类中的方法名称。

最终在输出文件夹里找到几个关键文件:

主要是DLL文件。在Matlab的安装目录下:

…\MATLAB\toolbox\dotnetbuilder\bin\win64\v2.0中找到MWArray.dll,然后将MWArray.dll和prj.dll拷到C#的工程中的Debug文件夹中。

四、       Visual Studio的设置以及C#调用DLL文件

Matlab和C#混合编程的时候,VS不需要特殊的设置,Matlab和C++混合编程的时候VS设置比较麻烦,这个在后面再做说明。以下讲C#的设置。

在VS2013中建立C#窗体应用程序

建立完之后需要往工程里面添加引用。

如上,在引用那里右键添加引用,然后点击浏览找到MWArray.dll和prj.dll并添加,结果如图所示,点击确定退出。

 

在需要使用prj中的函数的文件里面添加如下命名空间说明:

using MathWorks.MATLAB.NET.Arrays;

using MathWorks.MATLAB.NET.Utility;

using matPrj;

 

为了简单的测试,可如下操作:

在窗体中添加两个textbox和一个button。

双击button,在private voidbutton1_Click(object sender, EventArgs e)中添加程序:

 

           matPrj.prj.maMathClass output = new matPrj.prj.maMathClass();//实例化maMathClass类

 

            MWArray a = 2;//建立MWArray类以便Matlab识别

            MWArray b = 3;

 

            MWArray[] x =output.myadd2(2, a, b);

 

            MWNumericArray y =(MWNumericArray)x[0];//提取输出y,z

            MWNumericArray z =(MWNumericArray)x[1];

 

            double[,] y1 =(double[,])y.ToArray(MWArrayComponent.Real);

            double[,] z1 = (double[,])z.ToArray(MWArrayComponent.Real);

//将y,z转化为C# 数组

            double y2 = y1[0,0];

            double z2 = z1[0,0];

            textBox1.Text =y2.ToString();

            textBox2.Text =z2.ToString();

这段程序应该这样理解,输入a和b可以是两维数组,相应的输出y和z也是两维数组,y是第一个两维数组,z是第二个。

其中y1和在z1是转换成C#的数组,y2和z2是提取数组中的第一个元素

编译并运行程序,点击button,结果如下:

测试成功!

 

异常情况:

可能会出现类型初始值设定异常

解决方案如下:

1. 重新安装MCR,选择安装路径为C:\MCR (不含空格,中文)

2. 确保环境变量正确 path后添加:C:\MCR\v713\runtime\win32

3. 运行 -> regsvr32 mwcomutil.dll

4. 重新build .dll文件,package中选择add MCRsetting中设置assembly typesharedencryption keyfile设为空,再把新生成的dll文件拷贝到那台电脑,替换,重新引用

5. 重启 or 重启VS

详情见http://blog.csdn.net/kindlucy/article/details/7110329

 

五、       Visual Studio的设置以及C++调用DLL文件

六、       变量的转换说明

   函数调用前需要转换变量:

(1)将c#的参数输入到matlab函数时,要将参数转化为matlab的参数形式,通常是MWArray类型。 

(2)matlab返回的参数,也要转化为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#等语言的转换中间类型。 

已经添加了的引用 

 

常用的转换函数:       

① 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); 

 

(3)必须注意到多参数输入和多参数返回的问题。刚开始碰到这个这个问题比较头疼,后来经过不懈的努力,终于从网上找到答案。 

声明这部分是我参考别人的想法自己写的额,网上百度知道也有我(lwq123_321)回答的。 

//输入这里想传入的2个输入参数,为了支持矩阵好通用,所以得弄成Array             double[] a = { 1, 2, 3, 4, 5, 6 };//输入参数1             double[] b = { 2, 4, 6, 8, 10, 12 };//输入参数2             double[,] c = new double[3, 2];//输出参数1             double[,] d = new double[3, 2];//输出参数2 //这些参数都是矩阵 

            MWNumericArray ma = new MWNumericArray(3, 2, a);//转换成matlab需求的格式 

            MWNumericArray mb = new MWNumericArray(3, 2, b);  

//输出参数是一个MWArray数组 

            MWArray[] agrsOut = new MWArray[2];//两个输出参数,一定要写数量 

            //输出几个输出参数可以是不同类型的,比如第一个元素是矩阵,第二个是数值 

 //同理,输入参数也是一个MWArray数组 

            MWArray[] agrsIn = new MWArray[] { ma,mb}; //调用函数,输出参数需要加 ref 关键字 

            myFun.MatrixOpera(2, ref agrsOut, agrsIn);                         //2表示输入参数的个数,输出结构都在argsOut中,类似于c的指针参数输入 //转换得到实际的输出参数 

            MWNumericArray x1 = agrsOut[0] as MWNumericArray;                        MWNumericArray x2 = agrsOut[1] as MWNumericArray; 

                       c = (double[,])x1.ToArray();                       d = (double[,])x2.ToArray(); 

//一定要注意最后c和d的转化,不同类型的转换差异很大厄 //ToArray()对应n*m的数组 

//ToScalarDouble()对应单个数值 //ToVetor()对应1维数组

七、       参考资料

1.     C#调用matlab函数(混合编程)

http://wenku.baidu.com/view/77cf1e60f5335a8102d220e3.html

2.     浅谈C#与matlab的混合编程

http://wenku.baidu.com/link?url=Q3URh3KbXQi4JZUnFhvTUoMZDSAH97tdk3lwVr0fMQRc7Wx4k0HNYG4VHeW019GleyiivdeTTeYdVFtyam0NNkJZ5M6GR5yo9ltxvGSXgI3&qq-pf-to=pcqq.c2c

 

3.     小记Matlab与C#混合编程

http://blog.csdn.net/kindlucy/article/details/7110329

 

4.     MatLab和C++的混合编程-VS2010环境下的配置

http://wenku.baidu.com/link?url=Hf-i7UsvqZRhE_7NhDh4HxtTm8BuuoBt7K34-On17gueAHeCzEKZNHobsMlT-pSd0yz7yGPwU_1DVPcTIPy5Z_7PGy2zRUKSXT2V1SQqxIS

 

5.     vs2010和Matlab R2012b 混合编程

http://blog.csdn.net/stardust94605/article/details/8972064

 

6.     VS2013调用matlab2013b引擎混合编程问题(无法解析外部符号)

http://www.ilovematlab.cn/thread-292626-1-1.html

 

7.     visualc++中预定义的宏

http://www.cnblogs.com/tocy/p/4090459.html

 

8.     matlab2013不支持vs201

http://blog.csdn.net/gotomic/article/details/29594247

 

9.     MEX-filesGuide

http://blog.csdn.net/gotomic/article/details/29592553

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab2013b和Visual Studio 2013混合编程总结 的相关文章

  • 2013 一路走过

    2013 一路走过 想起当初找工作的时候 xff0c 一个人早上坐火车跑到其他大学的招聘会上去逛一圈 xff0c 了解招聘情况 然后下午又坐火车回学校 记得那天我投了十几份简历出去 xff0c 本打算投着试试 xff0c 没想到回来后有几家
  • Visual Studio 2017 代码自动对齐

    点 编辑 高级 设置选定内容的格式 或者按Ctrl 43 K 然后再按Ctrl 43 F 就好了 你可以在常用快捷键自定义 窗口中进行查看 1 进入工具 选项 对话框 2 选择 环境 键盘 3 在 显示命令包含 下面的对话框中输入 对齐 关
  • Visual Studio和VS Code的区别

    1 Visual Studio简介 xff1a 是一个集成开发环境 IDE xff0c 安装完成后就能直接用 xff0c 编译工具 xff0c 调试工具 xff0c 各个语言的开发工具 xff0c 都是已经配置好的 xff0c 开箱即用 适
  • 解决Android Studio 安装gradle失败、很慢

    拉取新的项目工程是 xff0c 总是会遇到gradle 下载特别特别慢 xff0c 而且经常都是等了很久最终还以失败告终 这时 xff0c 我们可以使用浏览器自己去下载gradle xff0c 或者找同事要一份相同版本的gradle xff
  • Visual Studio中gets报错解决方法

    方法如下 xff1a 1 这是敲出gets后报的错 2 经过查找资料 xff0c 知道vs2015之后就不支持gets了 xff0c 变成了gets s xff0c 并且后面的括号中也不能单独写一个数组名 xff0c 还需加上数组内的个数
  • Android Studio模拟器磁盘空间不足(Not enough disk space to run AVD)

    在Android Studio中运行模拟器时 xff0c 提示Error Not enough disk space to run AVD 39 39 Exiting 是说安装模拟的磁盘空间不足 xff0c 导致无法运行模拟器 Androi
  • Visual Studio 与 Visual C++ 关系

    Visual Studio netVisual C 43 43 netVisual C 43 43 MSC VER备注Visual Studio net 2002Visual C 43 43 net 2002Visual C 43 43 7
  • studio one 3 机架声道设置_雅马哈声卡的设置和使用方法

    雅马哈声卡的设置和使用基本大同小异 xff0c 小编今天用下面这款设备为大家介绍使用方法和设置 下图为 xff1a 雅马哈UR242声卡驱动界面和相关设置 因为雅马哈UR242声卡通道不够 xff0c 所以需要安装 ASIO Link Pr
  • Visual Studio配置OpenGL

    近期工作中需要用到OpenGL 而之前一直是用Opencv工作 xff0c 这就需要在VS上配置OpenGL 因为是首次在VS上配置OpenGL xff0c 以备自己和有需要的小伙伴不时之需 我的VS是2022版的 xff0c 但配置流程各
  • Ubuntu 16.04下安装visual studio code

    一 坑和解决办法 很多帖子上写的方法都是使用命令方式 xff1a 1 先安装make sudo add apt repository ppa ubuntu desktop ubuntu make sudo apt get update su
  • visual studio code中模拟浏览器端向服务端发起请求

    一 需要使用的插件 二 使用方式 1 创建 http文件 2 在所创建的 http文件中输入如下内容 相关具体的使用方式可参见 xff1a https marketplace visualstudio com items itemName
  • Android Studio报错:W/System.err: java.net.SocketException: socket failed: EPERM (Operation not permitt

    解决方案 xff1a 在AndroidManifest xml中增加 xff1a span class token operator lt span uses span class token operator span permissio
  • 【转载】关于Visual Studio、VC和C++的那些事

    size 61 medium 首先 xff0c 这三个东西有什么区别呢 xff1f VC和C 43 43 是相同的吗 xff0c 有什么区别呢 xff1f 我刚开始学C 43 43 的时候也有这样的问题 xff0c 在这里我来替大家解释一下
  • visual studio的team使用问题小结

    visual studio的team使用问题小结 一 visual studio xff08 2017 xff09 默认浏览器打开team任务和bug二 visual studio xff08 2017 xff09 上传team时 xff0
  • android studio maven 拉取代码出现 bad gateway 502

    一般都是gradle 配置的maven的仓库 问题 我这里是因为使用了 repositories google jcenter mavenCentral 新增 maven url 39 https www jitpack io 39 mav
  • visual studio升级

    visual studio升级 概述升级步骤温馨提示 概述 有时处于开发要求或者安全要求 xff0c 需要将visual studio升级到最新的版本 本篇文章记录一下如何升级 升级步骤 1 找到visual studio的安装路径下的安装
  • A review of visual SLAM methods for autonomous driving vehicles

    自主驾驶车辆的视觉SLAM方法回顾 原论文在文章末尾 摘要 xff1a 自主驾驶车辆在不同的驾驶环境中都需要精确的定位和测绘解决方案 在这种情况下 xff0c 同步定位和测绘 xff08 SLAM xff09 技术是一个很好的研究解决方案
  • Visual Studio 2022下载安装

    Visual Studio 2022下载安装 1 进入官网 官网地址 xff1a https visualstudio microsoft com 这里以Windows操作系统为例 根据需要选择版本 xff0c 我这里下载的是Enterpr
  • CUDA 初体验

    CUDA Visual Profiler CUDA编程指导 shared memory Page locked out memory C CUDA 调用 CUDA 编程介绍 CUDA 数据同步 CUDA Visual Profiler 在上
  • Microchip Studio 7.0 如何编译工程项目

    Microchip Studio 7 0 系列教程 1 Microchip Studio 7 0 如何修改字体大小Microchip Studio 7 0 如何修改字体大小 2 MicroChip Studio 7 0如何快速打开 h文件

随机推荐