先上总结:

由于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,这两个是匹配的,若不是使用的这两个版本,这里在这里看您的两个版本是否匹配。

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

绝对不将就!

能优化就一定要优化;

能完善就一定要完善;

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

原文:http://www.cnblogs.com/mashiqi/p/4279497.html

matlab与c 混合编程问题,MATLAB与C/C++混合编程的一些总结相关推荐

  1. c 与matlab混编,谈谈Matlab与C/C++或C#的互调用(混合编程)

    记得当初一个师姐问我知不知道如何在Matlab里调用C++的程序,还真把我问住了.因为我以前就知道C++调用Matlab的方法,这方面网上资料一大堆.没想到现在自己突发奇想又遇到另外一个问题,Matl ...

  2. matlab的矩阵编译器,MATLAB引擎方式实现VC与MATLAB混合编程

    VS2008是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快.但在科学计算方面函数库显得不够丰富.读取.显示数据图形不方便.Matlab是一款将数值分析.矩阵计算.信号处理和图形显 ...

  3. LabVIEW与MATLAB混合编程——调用Matlab中.m的函数

    LabVIEW与MATLAB混合编程--调用Matlab中.m的函数 1.调用labview中的matlab script 通过Labview中的Matlab script可以调用Matlab的.m程 ...

  4. matlab接口编程配置,MATLAB与外部程序接口编程

    基本信息 书名:MATLAB与外部程序接口编程 定价:42.00元 作者: 出版社:机械工业出版社 出版日期:2009-01-00 ISBN:9787111257066 字数: 页码: 版次: 装帧: ...

  5. matlab接口与编程,精通MATLAB接口与编程

    基本信息 书名:精通MATLAB接口与编程 定价:49.00元 作者: 出版社:电子工业出版社 出版日期:2007-01-00 ISBN:9787121036576 字数: 页码: 版次: 装帧: 开 ...

  6. 《MATLAB专刊》——利用向量化编程提升MATLAB代码执行效率

    文章目录 1. 实验说明 2. 实验结果 3. 源程序 3.1 绘图源程序 3.2 测试源程序 4. 参考资料 为了阐明采用向量化编程思路对于MATLAB双重 forforfor循环优化的效果,本文通 ...

  7. 蓄电池与超级电容混合储能并网matlab simulink仿真模型

    蓄电池与超级电容混合储能并网matlab simulink仿真模型. (1)混合储能采用低通滤波器进行功率分配,可有效抑制功率波动,并对超级电容的soc进行能量管理,soc较高时多放电,较低时少放电, ...

  8. 金融计算与编程 基于matlab,金融计算与编程.pdf

    金融市场与风险管理系列教材 金融计算与编程 ---基于 MATLAB 的应用 曹志广 著 上海财经大学出版社 ( ) 图书在版编目 CIP数据 : / : 金融计算与编程 基于 的应用 曹志广著 上海 ...

  9. 蓄电池与超级电容混合储能并网matlab/simulink仿真模型,混合储能采用低通滤波器进行功率分配,可有效抑制功率波动

    蓄电池与超级电容混合储能并网matlab/simulink仿真模型,混合储能采用低通滤波器进行功率分配,可有效抑制功率波动,并对超级电容的soc进行能量管理,soc较高时多放电,较低时少放电,soc较 ...

  10. matlab 计算指北角,运筹学及MATlab编程.doc

    运筹学及MATlab编程 一. MATLAB中的优工具箱 利用Matlab的优化工具箱,可以求解线性规划.非线性规划和多目标规划问题.具体而言,包括线性.非线性最小化,最大最小化,二次规划,半无限问题 ...

最新文章

  1. nodejs 转换long到unsigned long(NXT)
  2. cv2.waitKey(x)解析
  3. mysql 多项式_多项式拟合和最小二乘问题
  4. 禁用浏览器滚动条的解决方案
  5. P3805 【模板】manacher算法
  6. Python Socket通信黏包问题分析及解决方法
  7. MySQL错误1264和1366_Mysql错误1366 - Incorrect integer value解决方法
  8. 刚刚出炉的Asp.net网站部署视频教程
  9. Pytorch DataLoader一次性封装多种数据集(pytorch Data学习六)
  10. Win10开机跳过欢迎界面直接进系统桌面的设置方法
  11. 读取MySQL二进制文件_MYSQL: mysqlbinlog读取二进制文件报错read_log_event()
  12. 图像扩充边界_使用机器学习来索引数十亿图像中的文本
  13. Canny算子边缘检测——非极大值抑制Non-Maximum Suppression
  14. 【贪玩巴斯】无线传感器网络(三)「Mac协议讲解」——2021-10-08
  15. Bilinear CNN
  16. 如何控制计算机远程开机、运行和关机
  17. YGG 在 Branch.gg 的免费游戏 Castaways 中购买了 Genesis NFT
  18. 常见的电脑系统故障原因及解决办法
  19. 【初学疑惑】开发者工具可信度高吗?Python爬虫实战场景
  20. 程序员如何积累编程技术或编程经验?

热门文章

  1. PowerShell远程连接到Windows
  2. 基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号
  3. JS是按值传递还是按引用传递?
  4. bilibili弹幕转ass
  5. SQL Server 2008 安装或卸载时提示“重启计算机失败的解决办法(转)
  6. 20.案例实战:为@Async实现一个自定义线程池
  7. hive编程指南_第三篇|Spark SQL编程指南
  8. kali安装步骤失败 选择并安装软件_PhotoShop CS5中文版软件下载+安装详细步骤
  9. 学会这 6 招,网页搜索一秒就能搜到你想要的【老司机必备神技】
  10. python可以通过引用来对象吗_Python的可调用对象