加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Matlab mex程序32位升级到64位

(2016-01-23 23:07:05)
分类: 数字图像处理
平时研究中经常使用网上的开放源代码,由于效率问题,很多基于matlab的程序都是基于mex与c/c++混合编程的,部分源代码是基于32位系统的,如果想在64位matlab环境使用,需要将mex源代码升级到64位,Matlab支持一些标准的64位mex API.
mathworks 官网给出了详细的说明,但是有一些细节问题还不够全面;

升级的基本过程:一是更新变量类型为64位标准变量;二是更新编译选项为64位选项,具体过程如下:

1)在mex源代码文件中,凡是获取矩阵维度,使用mwSize数据类型,
例如,将 const int *idims =  (const int *)mxGetDimensions(data) 修改为
const mwSize *idims=mxGetDimensions(data);
2) 将涉及到矩阵索引的变量修改为mwIndex类型,例如int i,j for (i=0;i
    mwIndex i,j
    ****注意,mwIndex/mwSize 为无符号型的,涉及到与负数比较等操作时,需要使用 mwSignedIndex(没有mwSignedSize这种数据类型);官网没对该问题进行说明
    比如 
     mwIndex a,b;
     a=0;
     b=-1;
     if (b
        mxPrintf('b
    由于a,b均是mwIndex ,为无符号类型,因此if里面的输出就不会执行;正确使用如下,
     mwSignedIndex a,b;
     a=0;
     b=-1;
     if (b
        mxPrintf('b
3)1)与2)修改过程中,如果涉及函数的形参,也要对应修改;如果不涉及访问矩阵索引,矩阵数据以及调用函数的形参没有明确要求,其他变量无需修改;另外mwSize与mwIndex一般都等价于c中的size_t,所以这两个其实可以通用,不同命名只是为了突出其功能而已;
4) 由 1)或者2)计算的中间变量,也要声明为对应的类型;
5) 如果调用了matlab mex toolbox 中的标准函数,通过产看matlab标准说明文档,确定形参数据类型,从而修改传入的实参的数据类型;比如 mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);该函数的形参就要求矩阵行数m,列数n,必须为mwSize,如果需要在64mex程序中调用该函数,传入的实参必须声明为mwSize类型的;
6) 修改完后,使用 mex -O  -largeArrayDims  xxx.cpp进行编译;因为编译器默认是32位选项(-compatibleArrayDims选项)

另外,matlab  mex编程调试比较困难,可以多用mexPrintf 函数打印出相关的信息;也可以先使用VISUAL STUDIO 等IDE配置matlab环境进行调试~~


Ok,修改完就可以运行了~

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有