如何将c++代码改成matlab嵌入式代码生成

2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2016年10月优秀大版主2016年8月优秀大版主
2016年9月 总版技术专家分月排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2016年10月优秀大版主2016年8月优秀大版主
2016年9月 总版技术专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。&&&&&&&&&&&
& & &matlab中矩阵预算特别方便,但如果有无法避免的循环甚至多层嵌套的话,会非常影响程序的效率,因此通常会将这种需要大量循环的模块用c++编写然后在matlab中调用。matlab中的的c++编程称为mex编程(matlab executive),其中需要些一个c++文件,然后在matlab中用mex命令编译它,然后就可以在matlab中像调用函数一样调用c++代码了。&
& & &要使用mex编译,首先要在matlab中配置c++编译器,如果你的计算机中已经安装了某个c++编译器(例如vs或者gcc),在matlab命令行中直接输入"mex -setup"就会有相应的提示,然后选择下一步确定,编译器就设置成功了。
& & &接着就可以开始编写mex的c++文件了,下面举个例子,新建一个名为test.cpp的c++文件,代码内容如下:
#include "mex.h"
void mexFunction(int nlhs,mxArray* plhs[],int nrhs,mxArray* rhs[])
printf("hello world!");
  mex的源文件一定要include头文件"mex.h&,mex源文件的入口函数为void mexFunction,这个函数有四个参数:nlhs(n left hand side) 等号左边参数个数,plhs(pointer left hand side)等号左边参数指针,另外两个参数是等号右边的个数和指针。
& & &因为mex编译完成之后在matlab中是当函数用的,函数就有输入参数和返回参数,输入参数就是等号右边的参数,输出参数就是等号左边的参数,matlab中的函数允许有多个返回值,所以nlhs可以大于一。注意,指针plhs和prhs的类型为mxArray*,这是mex.h中定义的一种数据类型,是matlab里矩阵在c++源文件中的表示。
& & &当编写完上面的源文件之后,在matlab里执行命令"mex 文件名" 就可以编译这个文件,在这里用 mex &test.cpp编译它,编译完成之后可以看到同目录下生成了一个同名的.mexw32(或者.mexw64,取决于你的编译器是32bit还是64bit)文件,然后在matlab命令中输入test(),就可以看到打印出了"hello world "。这里想再次强调,mex源文件编译完成之后在matlab里当函数调用的。
1) mex编程中指针和索引:
& & & matlab中默认的数据类型是double,用class()函数可以看到变量的数据类型:
& & & & & & & & & & & & & & & && & &
& & 分析下面一段代码,matlab代码如下:
mex test.cpp '-g';
a = [1.1,2.1,3;4,5,6;7,8,9]
& & & 命令mex 用来编译mex文件,上面代码中 &mex &test.cpp &-g& 编译了test.cpp这个c++文件,编译完成之后会生成一个&test.mexw64&的文件,后缀名说明这是在win64下编译完成的mex文件,后面的'-g'是一个附加参数,在这里不用理解。编译后的mex文件可以当matlab函数使用。 & &
& & & 在matlab代码文件同目录下的c文件test.cpp代码如下:
#include 'mex.h'void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
input = mxGetPr(prhs[0]);
printf("第一个值%f\n",*input);
printf("第二个值%f\n",*(input+1));
运行.m文件,打印出结果如下:
& & & 在mex.cpp的代码中,mexFunction有四个参数,nlhs( number left hand s):左边参数个数,也就是matlab函数输出值得个数,mxArray *plhs[]是一个指针数组,数组中的每一个元素都是一个指针,指向输出的矩阵;nrhs 是右边参数个数,也就是输入参数的个数,mxArray *prhs[]数组中的每个指针指向输入矩阵。mxGetPr()函数返回一个double*型的指针,指向矩阵的第一个元素,在matlab代码中调用:mex(a),那也就是 prhs[0]是输入矩阵a的地址,而 input = mxGetPr(prhs[0]) ,input指向了a第一个元素1 。& & &那矩阵第一排第二列的值a(1,2)的地址是多少呢?是(input+1)吗?在这里我们运行上面的matlab代码,
& & &可以看出,输出的*(input+1)是4,也就是说,c++中的matlab矩阵是按列进行索引的。这里是一个需要注意的地方,因为很多地方要对matlab输入的矩阵进行遍历得到矩阵的元素值,如果索引出错,那就完全错了。其实这里的内在原因,是因为在matlab中矩阵是按列进行索引的,而c++中指针式按行往后加的。
& & &有很多函数可以方便我们对矩阵进行索引,uint32 mxGetM(mxArray *)输入一个矩阵的指针,返回该矩阵的行数,uint32 mxGetN(mxArray *)返回列数,对行数和列数适当的计算,可以方便的访问矩阵元素,例如,访问a(i,j): & *(input+N*(j-1)+(i-1)) &,N为矩阵行数,这里需要-1的原因是,matlab的行数列数从1开始计数,而c的数组则从0开始索引。
2)mex编程中的数据类型与指针移位的重要关系,mxGetPr() 与&mxGetData():
& & &前面说过,matlab里的默认数据类型是double,那么,如果把mex函数的输入矩阵的数据类型转换一下,会出现什么结果呢?
matlab 代码:
2 mex mex.cpp '-g';
3 a = [1.1,2.1,3;4,5,6;7,8,9];
4 a=single(a)
1 #include "mex.h"
2 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
input = mxGetPr(prhs[0]);
printf("第一个值%f\n",*input);
printf("第二个值%f\n",*(input+1));
c++代码并没有变,matlab代码也仅仅进行了一个数据类型转换,我们看看输出结果:
& & & 可以看到这里输出的已经不是我们期望的数值了。在我调试mex代码的时候这个问题苦恼了我很久,因为mex不方便调试,很多时候输出的结果不是想要的,而且我的输入矩阵都是上万维的,很难调试。这里输入矩阵a变成了single单精度类型,前面我们说过,mxGetPr()返回double类型的指针,当我们用double类型指针访问一个单精度(在c++)中我们称之为浮点型float的数据的时候,当然会发成内存越界,用取值符号*去取值的时候超过了数据的内存块,因此发生错误,如果我们修改c++代码:
1 #include "mex.h"
2 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
input = (float*)mxGetPr(prhs[0]);
printf("第一个值%f\n",*input);
printf("第二个值%f\n",*(input+1));
& & &将input类型设置成float,并将mxGetPr()的返回类型强制转换为float*就可以了。在这里还有一个函数mxGetData()也可以返回输入矩阵的头地址,只不过mxGetData()返回的是char*类型的指针,而mxGetPr()返回的是double*类型的指针,可以根据自己的需要选取函数,或者转换指针类型。如果指针类型不对,极有可能造成内存访问错误,导致matlab死掉。
3) nlhs 与 nrhs的作用&
& & &mexFunction函数中,两个指针参数分别指向输入输出的矩阵,而nrhs和nlhs分别记录输入输出矩阵的个数,在一般的操作中,我们仅仅对输入矩阵进行取值,运算,对输出矩阵进行赋值,nrhs和nlhs不是很常用,但是也是极其重要的。例如,在上面的代码中,如果我在matlab代码中这样调用mex:mex(),不输入任何参数,matlab就会马上死掉。因为在mex文件的cpp代码中,你用指针访问了输入矩阵的值,而在参数中你没有给mex输入任何参数,使得矩阵指针为野指针,导致内存错误。如果编码中出现这种参数不对的情况,将导致matlab频繁死掉,我的工作中数据特别多,准备数据需要几十分钟,这样让我非常痛苦。解决的方法就是利用nlhs和nrhs这两个参数。在mexFunction中判断nlhs的值来判断输入参数的个数,用nrhs判断输入参数的个数。如果输入参数少于某个值或者不满足你的要求可以让mexFunction直接return,避免后续的程序导致内存错误。
阅读(...) 评论()扫码下载APP
随时选购服务
需求发布后1小时内收到服务商响应每个需求平均有10个服务商参与95%以上的需求得到了圆满解决所有需求不向雇主收取任何佣金双11电商狂欢 爆款服务超乎你想像
把Matlab程序语言转化为C++语言
把Matlab程序语言转化为C++语言
雇主预算:¥3000.00
已收到 19 个服务商的文案稿件
有相似问题想解决?专业顾问来帮助您
通过猪八戒网实名认证,保证身份真实可靠
完成手机认证,保证能随时联系到服务商
该需求下的优秀交稿
TA的交稿:
1.&任务需求说明:&&&&&&&&将my_price_predict_garch.m改写成C/C&&程序。不包括画图功能。&&&&&&&&以动态库的方式提供&&&&&&&&my_price_predict_garch.dll&&&&&&&&my_...
TA的交稿:
学计算机和数学的,希望能做
TA的交稿:
您好,我是一名电子信息工程专业具有硕士学历的哦人,学过数理统计,精通matlab和C&&编程,知道怎样将matlab函数变成C&&程序,希望能为你提供全程优质的服务!谢谢!
TA的交稿:
具体请和我们联系
TA的交稿:
可以把Matlab转独立运行的c/c&&&程序,标准WIN32动态链接库
还有14个服务商交稿:
或 查看更多优秀交稿
交易成功的需求
其它工具软件相关需求

我要回帖

更多关于 matlab主成分分析代码 的文章

 

随机推荐