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混合编程总结 的相关文章

  • Visual Studio Code(VSCode) 编辑/编译/调试 C++ 代码

    前言 最近想要切换编辑工具 xff0c 之前工作中使用过 Source Insight xff0c Eclipse xff0c CLion 来写 C 43 43 代码 目前来说 Source Insight 已经非常古老 xff0c 只有编
  • 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 还需加上数组内的个数
  • 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 2022 C++ CLR 的艰难除 Bug

    请看下面一段代码 xff1a 运行结果 xff1a 这是一个Button xff0c 要用到这段代码是因为字符串出了问题 xff1a 肯定是我写的类出问题了 xff0c 便是我在控制台下测试是正常的 代码 xff1a 运行结果 xff1a
  • VsCode Studio的C/C++代码自动补全

    关于VsCode Studio的C C 43 43 代码自动补全 第一步 xff1a 需要下载VsCode中的C C 43 43 插件 如图 xff1a 插件下载后 xff0c 最好是重新启动一下VS 第二步 xff1a 找到设置 在输入框
  • Visual Studio + Opencv配置

    目录 Opencv安装 环境变量配置Visual Studio 库的两种配置 本文使用操作系统为Windows10 xff0c 仅适用于windows环境Visual Studio编译器上的 Opencv开发配置 Opencv所有平台通用的
  • 【vsCode + Arduino】在Visual Studio Code编译Arduino项目

    目录 前言一 参考文档二 操作步骤2 1 安装Arduino IDE2 2 在vsCode里安装Arduino插件2 3 配置arduino的安装路径2 4 配置好后打开一个Arduino的项目文件夹进行相应的配置 三 目前已知问题 前言
  • Visual C++6.0 一些编译链接报错解决

    01 VC 43 43 编写图形化界面链接时出现 LIBCD lib crt0 obj error LNK2001 unresolved external symbol main 的解决方案 在我使用VC 43 43 编写一个图形化显示界面
  • 利用Visual Studio创建C语言dll

    利用VS2019创建dll方法 动态链接库的定义及意义如何在VS创建dll入口函数DLLMain如何创建导出函数动态调用导出函数 动态链接库的定义及意义 动态链接库 xff08 Dynamic Link Library 或者 Dynamic
  • Macbook pro/air 2013 late -2014 使用转接卡更换NVME SSD休眠不醒问题的解决办法

    2021年1月更新 xff0c 发现升级 big sur 11 1之后 xff0c 固件版本变成了429 0 0 0 睡眠问题又回来了 xff0c 每次都睡死 xff0c 不醒 于是我按老办法 xff0c 把mbp114的nvme驱动刷到m
  • 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
  • 使用CMake和Visual Studio搭建工程并引入OpenCV库

    前言 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 在之前的Windows平台下OpenCV的编译与安装 Mega Li的博客 CSDN博客 nbsp 中介绍了Windows平台中使用CMake编译Open
  • 【VSCode】Visual Studio Code软件使用入门

    说明 这是一篇VS Code IDE软件使用入门文章 xff0c 工欲善其事 xff0c 必先利其器 xff0c 在使用新IDE之前 xff0c 不妨先对其进行一个全面了解 如果你做WPF等桌面端开发 xff0c 目前VSCode还没有好用
  • visual studio升级

    visual studio升级 概述升级步骤温馨提示 概述 有时处于开发要求或者安全要求 xff0c 需要将visual studio升级到最新的版本 本篇文章记录一下如何升级 升级步骤 1 找到visual studio的安装路径下的安装
  • 使用Visual Studio Code开发Arduino踩坑日记(持续更新)

    使用Visual Studio Code开发Arduino踩坑日记 持续更新 文章目录 使用Visual Studio Code开发Arduino踩坑日记 持续更新 1 在browse path中未找到包含文件问题描述问题分析解决思路解决过
  • Visual Studio 2022下载安装

    Visual Studio 2022下载安装 1 进入官网 官网地址 xff1a https visualstudio microsoft com 这里以Windows操作系统为例 根据需要选择版本 xff0c 我这里下载的是Enterpr
  • Studio设计布局的新姿势

    目录 ConstraintLayout基本界面 ConstraintLayout约束类型 尺寸约束 边界约束 基准线约束 清除约束 约束示例 自动约束Autoconnect 约束推断Inference View Inspector Fixe

随机推荐