Matlab mex程序32位升级到64位
(2016-01-23 23:07:05)分类: 数字图像处理 |
平时研究中经常使用网上的开放源代码,由于效率问题,很多基于matlab的程序都是基于mex与c/c++混合编程的,部分源代码是基于32位系统的,如果想在64位matlab环境使用,需要将mex源代码升级到64位,Matlab支持一些标准的64位mex
API.
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
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
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,修改完就可以运行了~