Matlab + VS | Matlab2014a + VS2010 Win7 混编调试

Matlab在处理矩阵运算等数学类操作时很方便,但是在循环处理上效率相较VS低了很多,所以经常会用到mex对Matlab的.m混编C文件,调用C函数,提高代码运行效率。以上是我的一点粗浅的理解,欢迎大家补充。

要进行Matlab和C混编,首先需要安装Matlab和VS或VC(Windows系统)。我软件的版本是Matlab2014a和VS2010,只要可以互相兼容调用,编译器的版本倒不是区别很大。

下面介绍一个Matlab通过Mex混编C的简单例子。代码主要功能是输入数组b和整数a,输出数组c的每个元素等于b的元素加上a的值。代码.m和.cpp内容如下:

% Matlab代码
% 其中test为混编调用C函数

a = 1;
b = [ 1 : 10 ];
c  = test( b, a );
c

下面是C++代码,命名为test.cpp:

准备好代码之后,值得说明的是,代码.m中调用test函数,是C++混编的,在C++代码中依赖文件名以区分,即C++命名为调用的函数名test.cpp。要对该文件进行混编,需要在Matlab下选择编译器,这个其他博客中有说的很清楚的,我就简单带过了。具体可以参考:点击打开链接

Matlab中输入mex -setup后,看到可以选择的编译器。

单击或输入命令都可以,我选的是C++,如下图:

下面对test.cpp进行编译,直接输入mex test.cpp命令,注意当前命令窗口所在路径包含test.cpp文件,或在同一文件路径下。

编译成功后,在文件栏也会有mex文件产生,如下图:

当然程序复杂之后,编译过程往往不会那么顺利,可能会出现很多错误,如果是cpp编写错误,Matlab还是很人性化的提供很多提示,如下图:

这个时候把错误调对了,基本上就可以正确编译了,但是往往不会那么顺利,所以就到了今天想分享的重点,就是Matlab与VS混编时时候跨平台调试debug。这个我也是在盲调了好久之后,才发现原来可以这么跨平台调的,反应迟钝。。。盲调应该是所有coder的噩梦(可能这个词是我创的)。

当然,要进行跨平台调试的前提是把语法错误全部搞定,才能编译通过。要debug的话,编译命令只需改成mex test.cpp -g就可以了!Matlab也会产生相应pdb文件。

这个时候用VS打开test.cpp,找到工具栏-调试-附加到程序:

点开之后看到的是:

找到Matlab,点击附加,就可以看到VS与Matlab的一些通信中间消息:

注意增加几个断点(不然程序还是不能停的= =)。然后回到Matlab页面,进行正常调试:

只要设置断点,按键F5或点击调试,之后就会跳转到VS里面的断点处:

这样调试就很方便了!变量之类的内容的都可以看见,而且鼠标放在数组处可以看到当前读取的内容值,真的很人性化。从此以后,再也不用害怕混编啦!

另外,我说一下,混编里面常出现的但也容易忽略的错误吧(我经常犯),注意到会简约不少不必要的时间。Matlab里面初始化数组默认是double类型的,因为没有特别明显的参数区别,所以在传参的时候时常会忽略这一点,我的示例里面用到的b在Matlab中声明的时候,虽然赋值都是整数,但机器内给的是double型,所以初次调试的时候,返回的结果还是不对。

这个错误还是比较明显的,因为我的程序里面没有设置检验类型的代码(建议大家规范一些就加上判断传参类型),所以程序运行下来没有报错,但是结果是错的,不过这个错误明显是数据类型不匹配导致的。后来检查一下,发现确实是。

  

这个只需要改一下test.cpp里面的接收参数指针类型,由int改为double就解决了。

还有一个常遇到的是C代码里面有程序问题,调试过程中时常遇到错误,会导致Matlab崩溃。这个时候如果让Matlab继续运行,我们再修改代码之后mex可能会提示pdb正在使用,没办法更新,目前我想到的办法就是重启Matlab,希望能找到不那么麻烦的方法。欢迎大家一起讨论!祝混编一切顺利!

时间: 2024-10-05 20:47:33

Matlab + VS | Matlab2014a + VS2010 Win7 混编调试的相关文章

Matlab与C混编的介绍

原本写给一个朋友的,帮助她入门matlab与C混编的 >#####环境: * Matlab:MATLAB R2013a * C编译器VC++2012 === #####配置环境: 在**Matlab**命令行下输入: **step.1** ``` mex -setup ``` --- **step.2** 你也可以使用: ``` help mex ``` 查看更多信息 --- **step.3** 按提示安装C编译器 --- **step.4** 编写**c-mex**文件 可使用 ``` ed

OSG+VS2010+win7环境搭建---OsgEarth编译

OSG+VS2010+win7环境搭建---OsgEarth编译 转:http://www.cnblogs.com/hnfxs/p/3161261.html Win7下 osg+vs2010环境搭建 一.相关准备 a) Osg源码 当前最新版:OpenSceneGraph的3.0.0.zip 下载链接: http://www.openscenegraph.org/downloads/stable_releases/OpenSceneGraph-3.0/source/OpenSceneGraph-

Flutter 开发集合系列之优雅的 Flutter 组件化 混编方案大神必学

背景 此篇文章,主要针对想要在原有Native工程的基础上集成Flutter的需求,所提供的混编方案的探讨. 官方方案的优缺点 (1)优点: 不需要每次 Run 起来之后,先进行 同步flutter代码(组件化Flutter后,因为组件化后flutter代码已经变为framework,所以每次进来需要先热更新同步代码)不需要单独搞一个组件进行集成,管理组件的版本,发布等.(2)缺点: 会非常耦合工程,需要修改工程配置,添加 BUILD PHASE 调用 flutter 中 xcode_backe

在vs 2015环境下,c语言和汇编混编操作简析(更新中......)

在VS 2015环境下如何混编. 在新建工程里也会发现了很多问题, 应用程序类型分为:windows应用程序,控制台应用程序,DLL,静态库 静态库: 静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库. 程序编译一般需经预处理.编译.汇编和链接几个步骤.静态库特点是可执行文件中包含了库代码的一份完整拷贝:缺点就是被多次使用就会有多份冗余拷贝. 静态库和动态库是两种共享程序

Python和C|C++的混编(二):利用Cython进行混编

还可以使用Cython来实现混编 1 下载Cython,用python setup.py install进行安装 2 一个实例 ① 创建helloworld目录 创建helloworld.pyx,内容如下: cdef extern from"stdio.h": extern int printf(const char *format, ...) def SayHello(): printf("hello,world\n") ② 编译,最方便的是利用python的Di

Swift和Objective-C混编注意事项

前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛.当然这对新入行的童鞋没来讲,的确算是福音,但对于整个iOS编程从业者来讲,真真是,曾几何时"高大上",转瞬之间"矮矬穷".再加上培训班横行,批量批发之下,iOS再也看不到当年的辉煌.iOS10推出后,紧跟着Xcode8也推送了更新,细心者会发现,Xcode8下iOS版本最低适配已变为iOS8.0,加上Swift版本趋于稳定,从某种意义上讲,

swift混编oc碰到的问题

在swift中混编苹果官方的Reachability OC文件. 因为swift工程的target是生成framework而非app,framework中调用oc与app中使用桥接文件还不一样,参考: http://blog.csdn.net/cooldragon/article/details/50172649 主要步骤为: 1.将Reachablity.m 和.h文件加入到工程中 2.在ESPlus.h 中最后加上 (ESPlus为Framework名称) #import <ESPlus/R

在Swift中实现 oc与swift的混编

在Swift中想要引用OC头文件(import),可采用混编的方法,这里以sqlite为例,采用OC-Swift桥的方式实现添加头文件1引入sqlite数据库的库文件 打开工程配置文件,在build Phases选项标签的第三个选项中添加sqlite3 2.先创建桥文件 command + N键选择创建头文件 写一个名字 将要引入的文件在这个Header桥文件里进行引入就行,即将import 语句写在这里 3 配置桥接文件打开工程配置文件,在build setting选项标签搜索框里输入brid

Xcode中C、C++、Object-C3种语言的混编

转自: http://hi.baidu.com/onejw/item/f34390c997cdc226a1b50ae http://www.cocoachina.com/ask/questions/show/57217 http://www.cnblogs.com/uyoug321/archive/2010/12/11/1903499.html Xcode中支持C.C++.Object-C3种语言的混编 Xcode中支持C.C++.Object-C3种语言的混编,那么如果想让编译器混编,只需要将