c读mat
C++读写.mat⽂件
分类:C/C++2012-11-21 10:50 1869⼈阅读评论(0) 收藏举报
最近在编写C++程序的过程中,需要使⽤matlab⽣成的.mat⽂件,于是查了基本使⽤⽅法。我的计算机环境是win7 64位系统,VS2010,matlab R2010b。
⼀、⼯程配置:
1.C/C++->常规->附加包含⽬录添加:
MATLAB\R2010b\extern\include
MATLAB\R2010b\extern\include\win64
2.链接器->常规->附加库⽬录添加:
MATLAB\R2010b\extern\lib\win64\microsoft
MATLAB\R2010b\extern\lib\win32\microsoft
3.链接器->输⼊->附加依赖库添加:
libmat.lib
libmx.lib
libmex.lib
libeng.lib
由于所安装的matlab为64位,要调⽤其函数,需要将⼯程转换为X64
4.顶菜单->⽣成->配置管理器->平台:X64
5.链接器->⾼级->⽬标计算机:
MachineX64(/MACHINE:X64)
6.计算机环境变量->path 添加:
E:\DevTools\MATLAB\R2010b\extern\lib\win64\microsoft;
E:\DevTools\MATLAB\R2010b\bin\win64;
⼆、所⽤到的基本读取写⼊mat⽂件代码⽰例:
⾸先需要包含头⽂件:
#include
[cpp]view plaincopy
1.MATFile *pmatFile = NULL;
3.
4.// 读取.mat⽂件(例:mat⽂件名为"initUrban.mat",其中包含"initA")
5.double *initA;
6.
7.pmatFile = matOpen("initUrban.mat","r");
8.pMxArray = matGetVariable(pmatFile, "initA");
9.initA = (double*) mxGetData(pMxArray);
10.M = mxGetM(pMxArray);
11.N = mxGetN(pMxArray);
12.Matrix A(M,N);
13.for (int i=0; i
14.for (int j=0; j
15. A[i][j] = initA[M*j+i];
16.
17.matClose(pmatFile);
19.
20.// ⽣成.mat⽂件
21.double *outA = new double[M*N];
22.for (int i=0; i
23.for (int j=0; j
24. outA[M*j+i] = A[i][j];
25.pmatFile = matOpen("A.mat","w");
26.pMxArray = mxCreateDoubleMatrix(M, N, mxREAL);
28.matPutVariable(pmatFile, "A", pMxArray);
29.matClose(pmatFile);
printf输出格式matlab三、程序说明
1.使⽤matOpen函数打开mat⽂件
MATFile *matOpen(const char *filename,const char *mode)
mode:
r:以只读⽅式打开
u:更新模式,可读可写,但是如果要打开的数据⽂件不存在,也不会创建新的⽂件w:以写⼊⽅式打开,只能写如⼊,如果要打开的数据⽂件不存在,则创建⼀个新的⽂件2.使⽤matGetVariable函数读取mat⽂件中的变量
mxArray * matGetVariable(MATFile * pMF, const char * name);
读取名为name的变量,返回⼀个数据阵列指针
3.使⽤mxGetData函数获取数据阵列中的数据
void *mxGetData(const mxArray *pa );
返回时需要使⽤强制类型转换。
4.使⽤mxGetM和mxGetN函数获取数据阵列矩阵的维数
size_t mxGetM(const mxArray *pa);
size_t mxGetN(const mxArray *pa);
5.使⽤mxCreateDoubleMatrix函数创建数据阵列为双浮点数矩阵
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity flag);
6.使⽤mxSetData函数将变量存⼊数据阵列
void mxSetData( mxArray *pa, void *newdata );
7.使⽤matPutVariable函数将数据阵列存⼊到mat⽂件中
int matPutVariable(MATFile * pMF, const char * name, const mxArray * pA); 存⼊成功返回0,存⼊出错返回⾮0
8.由于malab中矩阵的存储是按列存储,与c中不同,所以从mat⽂件中获取的矩阵需要重新排列。⽣成mat⽂件时,同样要注意。
9.完成mat⽂件操作后需要调⽤matClose函数关闭⽂件,并使⽤mxFree释放内存
VC读取mat格式⽂件
分类:VC2012-06-13 15:20 1424⼈阅读评论(1) 收藏举报matlabfiledependenciesmicrosoftnull2010
1. ⾸先设置Visual C++6.0 编译环境的设置
1-1通过菜单Tools/ Options,打开Visual C++6.0设置属性页,进⼊Directorie页⾯,在Show Directories for下拉列表中选择Include Files,添加路径:…PROGRAM FILESMATLABR2007AEXTERNINCLUDE(在Matlab的安装路径下),再选择下拉列表中的Library Files,添加路径:…PROGRAM FILESMATLABR2007AEXTERNLIBWIN32 MICROSOFTmsvc60 (在Matlab 的安装路径下)。编译环境只需设置⼀次.
1-2 添加库⽂件: 通过菜单 Projects|settings,进⼊ Link 页⾯,在 Object/Library Modules 框中,添加库⽂件名:lIBMx.lib libmat.lib libeng.lib。每个新的⼯程⽂件都要单独添加库⽂件。
2. 使⽤MATLAB 提供的MAT ⽂件接⼝函数
在C/C++程序中有两种⽅式可以读取MAT⽂件数据。利⽤MATLAB提供的有关MAT⽂件的编程接⼝函数。MATLAB的库函数中包含了MAT⽂件接⼝函数库,其中有各种对MAT ⽂件进⾏读写的函数,都是以mat开头的函数。如表1所⽰。
表1 C语⾔中的MAT⽂件读写函数
MAT 函数功能
matOpen 打开 MAT ⽂件
matClose 关闭 MAT ⽂件
matGetDir 从 MAT ⽂件中获得 MATLAB 阵列的列表
matGetFp 获得⼀个指向MAT ⽂件的ANSI C ⽂件指针matGetVariable 从MAT⽂件中读取MATLAB阵列
matPutVariable 写MATLAB阵列到MAT⽂件matGetNextVariable 从MAT⽂件中读取下⼀个MATLAB阵列matDeleteVariable 从MAT⽂件中删去下⼀个MATLAB阵列matPutVariableAsGlobal 从MATLAB阵列写⼊到MAT⽂件中matGetVariableInfo 从MAT⽂件中读取MATLAB阵列头信息matGetNextVariableInfo 从MAT⽂件中读取下⼀个MATLAB阵列头信息
3. 程序举例
⽬录下有AA.mat ⽂件,内有⼀个名为AMatrix的double 类型矩阵。代码如下:#include #include
#include "mat.h"
#include "iostream.h"
#include "mex.h"
#include "matrix.h"
int main()
{
MATFile *pmat;
const char **dir;
const char *file;
const char *name;
int ndir;
mxArray *pa;
file="E:\c++\exe\AA.mat";//双反斜杠防⽌转义
pmat=matOpen(file, "r");//打开⽂件,返回指向⽂件指针
if (pmat == NULL) {
cout<<"Error opening file:"<
return(1);
}
dir = (const char **)matGetDir(pmat, &ndir);
//ndir 表⽰mat⽂件中含有矩阵数⽬
if (dir == NULL) {
cout<<"Error reading directory of file:"<
return(1);
}
else
{
cout<<"Directory of file:"<
for (i=0; i < ndir; i++)
cout<
}*/
pmat=matOpen(file, "r");//重新打开⽂件
pa = matGetNextVariable(pmat, &name);
//返回指向⽂件头⽂件信息的指针,指针类型为*mxArray
//name 是矩阵的名字
cout<
pmat=matOpen(file, "r");
int ii=mxGetM(pa);//矩阵⾏数
int jj=mxGetN(pa);//矩阵列数
pm=mxGetPr(pa); //获取矩阵数值,返回指向矩阵第⼀数值的指针
cout<<*(pm++)<
cout<<*(pm++)<
// cout<<*(pm++)<
mxFree(dir);
return(1);
}
C++读取mat⽂件:
1.vs2010的配置
新建⼀个⼯程,在属性管理器中选择Debug|Win32->www.doczj/doc/a86199d2e009581b6bd9eb5a.html er-
>VC++⽬录。设置包含⽬录为:D:\MATLAB\R2010a\extern\include(我的matlab装在D盘);设置库⽬录为:
D:\MATLAB\R2010a\extern\lib\win32\microsoft。如图
2.设置环境变量path
计算机->属性->⾼级系统设置->⾼级->环境变量
在Path中已经存在d:\MATLAB\R2010a\bin\,但是d:\MATLAB\R2010a\bin\win32下有个重要的libmat.dll。如果不把
d:\MATLAB\R2010a\bin\改为d:\MATLAB\R2010a\bin\win32 程序将⽆法运⾏。
理论上d:\MATLAB\R2010a\bin\应该会向深⼀步检索到libmat.dll。坑爹的windows这⼀步并没有去做,害哥花了⼀晚上才解决这个问题。这步设置完后要重启(环境配置完毕)。
3.使⽤MATLAB 提供的MAT ⽂件接⼝函数
在C/C++程序中有两种⽅式可以读取MAT⽂件数据。利⽤MATLAB提供的有关MAT⽂件的编程接⼝函数。MATLAB的库函数中包含了MAT⽂件接⼝函数库,其中有各种对MAT ⽂件进⾏读写的函数,都是以mat开头的函数。如表1所⽰。
表1 C语⾔中的MAT⽂件读写函数
MAT 函数功能
matOpen 打开 MAT ⽂件
matClose 关闭 MAT ⽂件
matGetDir 从 MAT ⽂件中获得 MATLAB 阵列的列表
matGetFp 获得⼀个指向MAT ⽂件的ANSI C ⽂件指针matGetVariable 从MAT⽂件中读取MATLAB阵列
matPutVariable 写MATLAB阵列到MAT⽂件matGetNextVariable 从MAT⽂件中读取下⼀个MATLAB阵列matDeleteVariable 从MAT⽂件中删去下⼀个MATLAB阵列matPutVariableAsGlobal 从MATLAB阵列写⼊到MAT⽂件中