matlab c 混合变成,MATLAB和C / C ++混合编程概述

2-810-jpg_6-1080-0-0-1080.jpg

第一个摘要:

由于C / C ++语言的函数输入和输出参数的特性,可以方便地将多个参数传递给函数,但是不能方便地返回多个参数. 要返回多个参数,您必须使用指针或结构/类(其他技巧?). 但是这些麻烦的地方在C程序的功能之间没有什么大问题,关键在于C和MATLAB之间的接口不要太复杂.

但是,当我们编写MATLAB代码时,由于变量的格式非常自由,因此我们经常尝试将变量的格式设计为非常容易理解的形式. 例如,我编写了m函数adaboost_mashiqi()来执行Adaboost算法的功能. 它的返回值包括向量,矩阵和结构. 在C语言中,这似乎非常复杂,但是却非常直观,这些变量应采用这种形式. 即使它是一棵多层树,它也应该是一个链表!

这两个段落的内容可以由下图表示.

解释这张照片. 最左侧是一个m文件,可以调用用C / C ++编写的名为true_function()的函数. 我们只需将此函数的输入和输出记录为输入和输出,因此该函数应如下所示:

由于输入和输出是MATLAB中的变量,因此它们可能是可理解的. 到达mexFunction()之后,首先要做的是将这些易于理解但不方便使用的变量转换为用C语言易于处理的方便使用的变量,然后调用true_function()函数以实现该功能,并最终实现这些功能. 方便但不易理解的变量将转换为与MATLAB可理解的变量兼容的变量.

但是,这并不是最好的方法,因为在mexFunction()中处理这些可理解但不方便的变量可能会很麻烦. 转换变量类型不是C / C ++的优势. C / C ++的优点是循环处理比MATLAB快得多!因此,我们有第二种解决方案,既可以避免C / C ++的缺点,又可以保留C / C ++的优点. 这是两全其美. 请看下面的图片:

此解决方案将参数转换工作放入MATLAB. 这是绝对正确的方法,因为MATLAB中变量之间的类型转换是完全免费的. 让我们看一看这种更改后的整个过程. 首先,主文件调用Interface()函数,参数传递在MATLAB中进行. 非常方便;进入Interface()函数后,在MATLAB平台上,每个变量都转换为C / C ++平台可以处理的格式(例如,结构每个成员变量都是独立传递的,而不是整体传递整个结构(等);现在到mexFunction(),因为该变量已在Interface()中处理,因此只需在这里做一些琐碎的事情,只需对其进行处理,然后直接调用true_function()即可实现特定的功能. 非常简单!

11-810-jpg_6-1080-0-0-1080.jpg

当然,仍然存在一些问题. 例如,在MATLAB中,我们经常将一些用于控制整个算法参数的变量放入结构变量选项中,然后将此结构传递给控制函数(例如算法的最大迭代次数),Epsilon大小收敛条件等). 在上述框架中如何实现这些选择?在这里,我给出一个解决方案. 首先,在Interface()之前调用options = OptionsSettings(...)函数,设置相应的控制变量,然后将此选项结构变量与输入一起传递给Interface()函数. 在Interface()函数内部,取出此选项结构的每个成员变量作为变量,然后将其传递给true_function().

mexFunction()中某些功能的摘要

在mexFunction()开头,通常需要将以prhs [?]存储的MATLAB格式的变量转换为C中double,int等类型的变量. 我该怎么办?如果prhs [0](即第一个输入)是MATLAB中的标量,向量或矩阵,则使用函数mxGetPr():

双* x_pointer = mxGetPr(prhs [0]);

对于MATLAB中的向量,可通过x_pointer [0],x_pointer [1],x_pointer [2],...访问. 对于MATLAB中的矩阵,例如3x3矩阵,则需要(1,1)的元素通过x_pointer [0]访问,通过x_pointer [1]访问(2,1)个元素,通过x_pointer [3 + 0]访问(1,2)个元素. 对于MATLAB中其他类型的数据,可通过mxGetData()访问:

类型* x_pointer =(类型*)mxGetData(prhs [0]);

mxGetData的返回类型为void *,因此需要类型转换. 请注意,mxGetPr()和mxGetData()的输入参数类型均为const mxArray *而不是mxArray *.

在mexFunction()的开头,通常需要将数据传输回MATLAB可以接受的类型. 在这种情况下,您需要使用诸如mxCreatDoubleMatrix()/ mxCreatNumericMatrix()/ mxCreatStructMatrix()之类的函数. 例子:

8-810-jpg_6-1080-0-0-1080.jpg

plhs [0] = mxCreatDoubleMatrix(3,3,mxREAL);

double * p = mxGetPr(plhs [0]);

for(int i = 0; i <10; i ++){

p [i] = i;

}

这完成了plhs [0]的分配. 返回MATLAB时,第一个输出将是向量(0: 9). 没错,它可以通过指向phls [0]的指针p像plhs [0]那样间接分配.

Blogger举了一个例子!

以上所述似乎很抽象. 这是一个链接. 这是我的守则. 您可以以它为例. 改变它对我并实践它. 但是我的代码也有一些缺陷. 由于我已经完成了整个代码的编写,因此当我回去对它们进行整理时,我发现了这些问题,所以我懒得修复它. 下次我会注意的. 以下是我的代码的问题matlab与c 混合编程,在这里写下,记录一下自己.

1-810-jpg_6-1080-0-0-1080.jpg

关于我在这段代码中对变量树的处理

在Adaboost_mashiqi()返回的结构中,第一个成员变量树本身也是一个结构,但是如上所述,在C函数之间传递参数的准则是尽可能的容易理解,因此在此处处理该树. 方法没问题. 该问题出现在树出现的第二个位置,即树返回到m文件. 这里的树仍然是一个结构,不是很好. 首先,变量格式不便于转换,但是如果要在add函数中添加函数并返回更多变量,则在这种情况下使用结构并不方便. 因此,您可以在m文件和c文件之间添加一个m文件以完成“可变格式转换”,这不会破坏原始m文件的格式,但也使C文件的结构更易于编写和扩大.

如何在MATLAB和Visual Studio平台之间进行混合编程?

废话不多,并且想知道如何设置Visual Studio进行混合编程调试,请单击此处. 另外,我使用的版本是MATLAB R2012b和Visual Studio 2010,两者是匹配的,如果不是使用的是两个版本,请在此处查看您的两个版本是否匹配.

关于编写程序的自我修养(/假装遮住脸):

一点都不!

如果可以优化,则必须优化;

如果可以改进,就必须改进;

1-1224-png_6_0_0_0_0_0_0_888.24_1224.465-888-0-0-888.jpg

如果您可以写得更漂亮,那么您必须能够写得更漂亮!

更多相关文章总结了一些MATLAB和C / C ++混合编程

此博客中所有博客文章的总目录: [常规目录]博客博客文章的总目录实时更新Matlab和C#混合编程的文章目录: [目录] Matlab和C#混合编程的文章目录最后一次我写了一个博客.....

最近的项目需要对matlab和C进行混合编程. 经过一番努力,该项目要解决的问题终于得以完成. 现在,我将总结一些Mex的经验,当然,这只是一个开始,随着我学到更多,我将继续添加它. . 首先谈谈编写Mex的一些一般规则,然后我...

最近的项目需要对matlab和C进行混合编程. 经过一番努力,该项目要解决的问题终于得以完成. 现在,我将总结一些Mex的经验,当然,这只是一个开始,随着我学到更多,我将继续添加它. . 首先谈谈编写Mex的一些一般规则,然后我...

Matlab和C / C ++混合编程-Mex的最新项目需要matlab和C的混合编程. 经过一番努力,该项目要解决的问题终于得以解决. 现在,我将总结一些Mex的经验,当然,只是开始,以后继续学习的加深...

最近我们把整个项目放在一起,这个项目比较复杂. 由于我们正在做一个检索系统,因此我们使用asp.net(c#)来制作网页,但是该算法是在matlab下实现的,因此我们必须使用matlab生成动态链接库dll,然后...

如果.c文件不依赖于任何第三方库,则mex编译非常简单,只需在matlab命令行上输入mextest.c. 但是,如果此c文件使用第三方库文件(例如opencv .gsl等),则需要更改...

版本matlab 2009和vc ++ 6.0 SP6步骤1)配置环境,创建一个新的VC项目,然后将以下路径添加到VC接口的“工具->选项”目录选项卡中的“包含” : 2)D: \ ...

(1)mex命令设置(a)运行Matlab,在Matlab的“命令”窗口中键入“ mex -setup”命令,然后按Enter键安装Matlab编译器: ...

最近,由于项目要求matlab与c 混合编程,某个项目的算法是基于MATLAB的,算法功能需要在短时间内调用. 因此,基于MATLAB生成DLL,并完成了C调用方法. 环境: MATLAB 2013a + VS2010 + w. ..

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%硬原始收入,转载请注明出处%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %... <

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/ruanjian/article-233060-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值