BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #2808同步于 2008/8/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖

C/C++和Matlab混合编程中的简易类型转换[转帖]

hmily821224
2008/8/1镜像同步1 回复
发信人: hmily821224 (笨笨猫), 信区: Matlab 标 题: C/C++和Matlab混合编程中的简易类型转换[原创] 发信站: 北邮人论坛 (Fri Aug 1 11:51:31 2008), 站内 概要: C/C++类型(内建,STL,OpenCV...)和Matlab矩阵的双向转换(在编译时或运行时). 关键词: C, C++, mxArray, OpenCV, IplImage, iterator, mex, engine 描述: 考虑以下场景(特别是当进行信号/语音/图像处理或科学计算时): 1 在运行时将数据注入Matlab进行数据可视化,以方便C/C++程序的调试. 但是直接调用engine API显得不那么方便。 2 使用mex实现底层算法以加速m文件. 每一次你都要先将mxArray转成C/C++类型,进行处理,最后将C/C++类型转成mxArray并返回. 这个Project提供了简单的方法完成上述任务——只要你有合适的迭代器(如果不熟悉迭代器请参考任何一本C++ STL的教科书) 对场景1请看以下例子: [QUOTE]/************************** * EXAMPLE A for scenario 1 **************************/ unsigned char rgb_img[3*256*126]; // 3D signal, i.e. color image // initialize rgb_img and do something to it... const char* command = "figure; imshow(I)"; // Dump it as 3D matrix named I. column(width):256,row(height):126 and page(channel):3, // then view it using matlab function "imshow". matlab << name ("I") << width (256) << height (126) << channel (3) << start (rgb_img) << cmd (command);[/QUOTE] 注入1D和2D信号也类似. 现在最大支持3D. 同样也支持OpenCV,看以下例子: [QUOTE]/************************** * EXAMPLE B for scenario 1 **************************/ IplImage* pimg; // openCV image types // initialize p and do something to it... // Dump pimg as matrix I. The size and types are made the same as pimg automatically. // Then view it. matlab << name("I") << var(pimg) << cmd("figure;imshow(I)");[/QUOTE] 对场景2看以下例子: [QUOTE]/************************** * EXAMPLE A for scenario 2 **************************/ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { vector<double> vt; double val; int n = (int) mxGetNumberOfElements(prhs[0]); vt.resize(n); // 1. convert mxArray to C/C++ types mat_to_values (prhs[0], vt.begin()); mat_to_scalar (prhs[1], &val); // 2. do some job to vt and val // 3. finally convert C/C++ types back to mxArray plhs[0] = values_to_new_mat (vt.begin(),vt.end()); }[/QUOTE] mat_to_values和values_to_new_mat的输入参数是指针或迭代器, 只要有合适的迭代器,你就能转换诸如C内建数组,std::list或其它什么用户数据类型(如OpenCV IplImage). 详请参阅zip文件内的更多例子和文档. 祝愉快:) 下载地址: Matlab的File exchange C/C++ and Matlab types convertor File Id: 20927 http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=20927&objectType=FILE
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
zixu1986机器人#1 · 2008/8/1
赞 虽然现在不是很熟悉 到coding的时候一定会非常有用