C++ 读写Matlab的mat文件的注意事项
通过Max文件,我们可以用Matlab调用C的函数。有时候我们在进行数据处理的时候,希望通过Matlab分析的数据存储成Mat格式。然后用C++来读取这个Mat文件。我们可以将这个Mat文件成为模型文件。在OpenCV中,模型文件使用.xml存放的。
首先我们得配置VS工程,配置的方法请见http://blog.csdn.net/left_la/article/details/8206645。
在实际的操作中有一些注意事项,可以帮助初学者减少debug的时间。首先先建议一个基本概念,就是Matlab的数据是以列优先存放的。而C++是以行优先存放的。比如一副10*10大小的图片,Matlab中I(10)是图片的左下角,C++中I(10)是图片右上角。
首先先看一个读取Mat文件的例子:
MATFile *pmatFile; mxArray *pMxArray; int A_N, A_M; float *A; Path += "A.mat"; pmatFile = matOpen(Path.data(),"r"); pMxArray = matGetVariable(pmatFile, "A"); A_M = mxGetM(pMxArray); //高 A_N = mxGetN(pMxArray); //宽 A = (float *)mxGetData(pMxArray); Path = ModelName;
matClose(pmatFile); 如果对于三位数据,再加一条 const mwSize *distrSize = mxGetDimensions(pMxArray); 那么distrSize[0],[1],[2]分别存放第一,二,三维。
看完这个例子之后我们需要注意两点: 1.mxGetData返回的是一个void类型指针,我们需要转成我们需要的指针。对于转成什么类型这里是有要求的。如果Matlab的A是single则必须转成float。如果A是uint32,则必须转成unsigned int(32bit)。换句话说每个数据所占的bytes在C++和Matlab中应该一一对应。即使转成其他类型是不报错的。但读出来的数据却为空。
2.对于A的大小是有限制的。如果A的数据过大是读不出来的,比如A是一个struct里面包含很多的矩阵,但具体限制是多少,description里面没有说。所以建议将A拆分成一个一个数据,然后分别读入。
再看一个写文件的例子: MATFile *pmatFile; mxArray *pMxArray; pmatFile = matOpen("./ModelSmall/result.mat","w");
pMxArray = mxCreateNumericMatrix(height, width*Chn, mxUINT8_CLASS, mxREAL);
mxSetData(pMxArray, (BYTE*)data); mxSetDimensions(pMxArray, (const mwSize *) datasize, chn); //datasize存放每一维的尺寸,chn为通道数 matPutVariable(pmatFile, "result", pMxArray); matClose(pmatFile); 三维数组其实是二维数组存放的,所以mxCreateNumericMatrix的第二个参数number of column为width*Chn。 通过mxSetDimensions来重组数组成为三维的。
首先先看一个读取Mat文件的例子:
MATFile *pmatFile; mxArray *pMxArray; int A_N, A_M; float *A; Path += "A.mat"; pmatFile = matOpen(Path.data(),"r"); pMxArray = matGetVariable(pmatFile, "A"); A_M = mxGetM(pMxArray); //高 A_N = mxGetN(pMxArray); //宽 A = (float *)mxGetData(pMxArray); Path = ModelName;
matClose(pmatFile); 如果对于三位数据,再加一条 const mwSize *distrSize = mxGetDimensions(pMxArray); 那么distrSize[0],[1],[2]分别存放第一,二,三维。
看完这个例子之后我们需要注意两点: 1.mxGetData返回的是一个void类型指针,我们需要转成我们需要的指针。对于转成什么类型这里是有要求的。如果Matlab的A是single则必须转成float。如果A是uint32,则必须转成unsigned int(32bit)。换句话说每个数据所占的bytes在C++和Matlab中应该一一对应。即使转成其他类型是不报错的。但读出来的数据却为空。
2.对于A的大小是有限制的。如果A的数据过大是读不出来的,比如A是一个struct里面包含很多的矩阵,但具体限制是多少,description里面没有说。所以建议将A拆分成一个一个数据,然后分别读入。
再看一个写文件的例子: MATFile *pmatFile; mxArray *pMxArray; pmatFile = matOpen("./ModelSmall/result.mat","w");
pMxArray = mxCreateNumericMatrix(height, width*Chn, mxUINT8_CLASS, mxREAL);
mxSetData(pMxArray, (BYTE*)data); mxSetDimensions(pMxArray, (const mwSize *) datasize, chn); //datasize存放每一维的尺寸,chn为通道数 matPutVariable(pmatFile, "result", pMxArray); matClose(pmatFile); 三维数组其实是二维数组存放的,所以mxCreateNumericMatrix的第二个参数number of column为width*Chn。 通过mxSetDimensions来重组数组成为三维的。
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了