第一个摘要:
由于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()即可实现特定的功能. 非常简单!
当然,仍然存在一些问题. 例如,在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()之类的函数. 例子:
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 混合编程,在这里写下,记录一下自己.
关于我在这段代码中对变量树的处理
在Adaboost_mashiqi()返回的结构中,第一个成员变量树本身也是一个结构,但是如上所述,在C函数之间传递参数的准则是尽可能的容易理解,因此在此处处理该树. 方法没问题. 该问题出现在树出现的第二个位置,即树返回到m文件. 这里的树仍然是一个结构,不是很好. 首先,变量格式不便于转换,但是如果要在add函数中添加函数并返回更多变量,则在这种情况下使用结构并不方便. 因此,您可以在m文件和c文件之间添加一个m文件以完成“可变格式转换”,这不会破坏原始m文件的格式,但也使C文件的结构更易于编写和扩大.
如何在MATLAB和Visual Studio平台之间进行混合编程?
废话不多,并且想知道如何设置Visual Studio进行混合编程调试,请单击此处. 另外,我使用的版本是MATLAB R2012b和Visual Studio 2010,两者是匹配的,如果不是使用的是两个版本,请在此处查看您的两个版本是否匹配.
关于编写程序的自我修养(/假装遮住脸):
一点都不!
如果可以优化,则必须优化;
如果可以改进,就必须改进;
如果您可以写得更漂亮,那么您必须能够写得更漂亮!
更多相关文章总结了一些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