MATLAB与C/C++混合编程的一些总结

【转载请注明出处】http://www.cnblogs.com/mashiqi

先上总结:

由于C/C++语言的函数输入输出参数的特点,可以将多个参数方便地传入一个函数中,但却不能方便地返回多个参数。要返回多个参数,就得用指针或者struct/class(其他的高招?)。但这些麻烦的地方在C程序的函数与函数之间是没有太大问题的,关键是不要在C与MATLAB的接口之处搞的太复杂。

但是,我们在写MATLAB代码的时候,由于变量的格式非常自由,所以我们往往都尽量把变量的格式设计成很comprehensible的形式。比如说,我写的这个能完成Adaboost算法功能的m函数adaboost_mashiqi(),它的返回值中既有向量,也有矩阵,还有结构体。这在C中看来是很复杂的,但却很直观,这些变量就该是这种形式的。甚至如果是多层树的话,还应该是链表呢!

这两段话的内容可以用如下这张图来表示。

解释一下这张图。最左边的是一个m文件,它准备调用一个用C/C++写的名为true_function()的函数。我们把这个函数的输入输出简单记为inputs和outputs,于是函数应该是这样的:

由于inputs和outputs都是MATLAB里面的变量们,所以它们很有可能是comprehensible的。到了mexFunction()后,首先要做的事情就是把这些comprehensible but not convenient的变量转换成C语言易于处理的convenient的变量,然后调用真正实现函数功能的true_function()函数去实现功能,最后再将这些convenient but not comprehensible的变量转换成合适与MATLAB的comprehensible的变量。

可是,这样做比那个不是最好的,因为mexFunction()中处理这些comprehensible but not convenient的变量可能相当麻烦。转换变量类型并非C/C++的优势,C/C++的优势在于对循环的处理极大的快于MATLAB!所以,我们有第二种方案,能避开C/C++的劣势,同时又保留C/C++的优势,这是一个两全其美的办法。请看下图:

此方案将参数转换的工作放到了MATLAB里面来做。这是绝对正确的一个方法,因为在MATLAB里面各变量之间的类型转换是相当自由的。我们来看看进行了这样的改变之后,整个过程变成了什么样。首先,主文件调用Interface()函数,参数传递都在MATLAB里面,很方便;进入Interface()函数后,在MATLAB平台上将各个变量转变为C/C++平台好处理的格式(比如说把结构体的各个成员变量分别独立传进去而不是把真个结构体作为一个整体传进去etc);现在到了mexFunction(),由于变量在Interface()里面已经经过了处理,在这里只需要再做一些trivial的处理就行了,然后直接调用true_function()来实现具体的功能。整个流程非常的easy!

当然,还有一些问题,比如在MATLAB中我们常常将一些控制整个算法参数的变量放进一个结构体变量options中,然后将这个结构体传入函数进行控制(比如算法最大迭代次数啊,收敛条件的epsilon大小啊等等)。这个options在上面这个框架里怎么实现呢?我在这个给出一个我的办法。首先,在Interface()之前调用options = OptionsSettings(…)函数,设定相应的控制变量,然后把这个options结构体变量随着inputs一起传入Interface()函数。在Interface()函数内部,将这个options结构体的各个成员变量单拿出来作为变量分别传入true_function()中,这样就可以了。

博主给个example啊!

上面说的似乎都好抽象,这里给个链接,是我的一个代码,大家可以拿去看看,作为example,在我这个上面改改,练练手。但我这个代码也有一些瑕疵的。由于已经把整个代码都写完了,回过头来梳理的时候才发现这些问题,所以就懒得改了,下次注意的就是了。下面是我的代码的问题,写在这里,做个自己的一个记录吧。

关于我的这个代码中的变量tree的处理

在Adaboost_mashiqi()返回的结构体中,第一个成员变量tree本身也是一个结构体,不过上面已经说过,C函数之间传递参数的准则是as comprehensible as possible,所以这里处理tree的方法没有问题。问题出现在第二个出现tree的地方,就是返回给m文件的tree,这里的tree依然是一个结构体,这样就不太好了,一是变量格式转换起来不太方便,而是若以后想要给添加函数添加功能返回更多的变量,那这种情况下使用结构体也不方便。因此,可以在m文件和c文件中间在加一个m文件来完成"变量格式转换"这件事,这样既不会破环原m文件的格式,也能使得C文件的结构更容易编写与扩展。

如何在MATLAB和Visual Studio平台之间hybrid programming?

废话不多说,想知道如何设置Visual Studio来进行混合编程调试,点这里。另外,我用的版本是MATLAB R2012b和Visual Studio 2010,这两个是匹配的,若不是使用的这两个版本,这里在这里看您的两个版本是否匹配。

关于写程序的自我修养(/装逼捂脸中):

绝对不将就!

能优化就一定要优化;

能完善就一定要完善;

能写地更加优美就一定要能写地更加优美!

时间: 2024-10-10 14:56:56

MATLAB与C/C++混合编程的一些总结的相关文章

【5.1送礼】国内第一部Matlab和C#.Net混合编程入门级视频教程【完全免费】

上一次写博客很久了,一直在忙彩票分析系统架构的事情,写博客真是件费神的事情,非常花时间.今天抽空发布这篇博客,是为了开源一部自己录制的视频教程-Matlab和C#.Net混合编程视频教程[入门级].下面说说这部视频教程的来由和一些事情,想获取的仔细看看,别忘了点[推荐]哦! 一.为啥要开源 1.1 视频的来源 这部视频教程是在2012年年底闲时比较多,当初也是很多朋友,网友提出这个Matlab.Net混合编程入门比较难,没有资料,所有就特意录制了一部比较简单的视频教程.并有条件的对广大网友免费开

matlab和C/C++混合编程--Mex

最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我们会重点关注混合编程中最难解决数据的问题--结构到底如何转换,并且后面会重点说一下自己的程序. 一.Mex的结构 先看一个简单的程序(该程序保存在matlab主目录下名字是mexDemon.cpp,或者在主目录下新建一个.cpp文件): #include "mex.h" //加入头文件,该

matlab和C/C++混合编程--调用opencv

最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然后用c#调用matlab,单单这个配置问题就搞了我们一个多星期,不过还是顺利解决了,解决方法以后有时间再写个博客出来. 虽然我们整个项目已经能在c#下跑通了,但是检索效果真不理想,检查各种可能出现问题的地方,首先自然是特征的问题.我们做的是偏图像的检索,有些现成的特征提取算法是在opencv下实现的

[Matlab] matlab与C/C++混合编程汇总

matlab 与外部程序的编程接口两大类: 一是 如何在matlab里调用其他语言写的代码. (见例子:使用C-MEX技术,ActiveX技术) 二是 如何在其他语言里调用matlab. (见 使用matlab引擎, MAT数据交换, matlab发布com组件, DeployTool) matlab接口技术包含以下几个方面: 1. 数据导入导出,主要是MAT文件数据的导入导出. 2.普通的动态链接库dll文件的交互,Matlab6.5起,直接matlab环境中调用dll文件导出的函数. 3.m

Matlab和C语言混合编程,包含目录的设定

如果.c文件不依赖于任何第三方库,那么mex编译很简单,只需要在matlab的命令行输入 mex test.c 即可. 但是如果这个c文件使用了第三方库文件,如opencv.gsl等等,那么就需要更改一下mex的编译选项,否则会报fetal error C1083,找不到包括文件. 这里需要注意的是,在mex之前,需要使用 mex -setup 选择编译器,假如我选的是VS2012,那么我需要把相应的选项加到VS2012所对应的opt文件中,具体的位置在 ‘MATLAB路径\R2013a\bin

Matlab 2013a 和 VS2010 混合编程

最近由于项目需求,某项目的算法是基于MATLAB完成的,在短时间内需要去调用算法功能.因此,基于MATLAB生成DLL, C 调用的方式完成. 环境:MATLAB 2013a + VS2010 + win8.1 + 64位系统 一.MATLAB 编译环境设置 1. 安装,MATLAB安装时选择 force 32bit, 这样生成的dll在32位和64位的机器上都可以调用. 2. 装好MATLAB 2013后,打开软件,进行配置 1 >> mex -setup 2 Welcome to mex

【新年送礼】国内第一部C#.Net调用Matlab进行混合编程的视频教程【彻底免费无注册码】

其他混合编程文章 1[原创]Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码) 2.[原创]Matlab.NET混合编程技巧之——找出Matlab内置函数 3.[原创]Matlab与.NET混编解决人脸识别问题 4.[原创]Matlab与.NET基于类型安全的接口编程入门 5.[原创分享]Matlab.NET混编调用Figure窗体 一.视频说明 2014年的5.1,我将这套视频教程进行了免费下载,免费注册开放:[5.1送礼]国内第一部Matlab和C#.Net混合编程

Matlab与.NET混合编程解决人脸识别问题

原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html [原创]Matlab与.NET基于类型安全的接口编程入门 http://www.cnblogs.com/asxinyu/archive/2013/05/16/3082299.ht

Matlab.NET混合编程技巧之——找出Matlab内置函数

原文:[原创]Matlab.NET混合编程技巧之--找出Matlab内置函数 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破脑袋,加班几个晚上,调试才能解决.同样,由于Matlab.NET混编的特殊性,加上MathWorks的原因,英文文档和没有披露一些详细的细节(甚至不允许反编译MWArray.dll,呵呵,它不允许,不代表你不会哦).经过很多项目,和大量的实验,也发现了一些小技巧和小秘密,今天就分享其中一个,先做一个