请教各位高手,用C/C++怎么读取mat文件中的结构体。比如:在matlab中定义了一个str结构体:str.level = 1, str.image = 1. str(2).image = 5, str(2).level = 3.然后把它存为mat文件我想在C++中读取它,并打印出来。请问代码怎么写。谢谢了
解决方案 »
- 如何在TXT文件中找到指定字符和定位
- VC中如何用HTTP协议POST文件
- 请教一个setAttribute的问题
- please help me!how to use SetWorldTransform interface function on wince?
- 数据库问题.
- WebBrowse控件中navigate方法里的postdata参数怎么用?
- _com_dispatch_method 怎么用
- 请教soft RAID的问题
- 请问如何监视所有IE浏览器里点击网页超连接的动作?类似网络蚂蚁和FlashGet。
- 关于向DLL传入变量的问题(对不起,我没分了,谢谢各位)
- 紧急援助用VC++6.0开发虚拟频谱仪
- ADO连接数据库_RecordsetPtr 如何获得数据库各表名,求助!!!!
1. 头文件中写入
#include "mat.h"
和
#pragma comment(lib, "libmat.lib")
#pragma comment(lib,"libmx.lib")
上面这三个文件在MATLAB安装目录下的extern\include和extern\lib目录下。一般来说安装MATLAB后这两个路径会被自动添 加到VC的设置中。如果没有,可以在VC的Tools->Options->Directories下手工添加。
2. 在MATLAB中定义两个变量
z=999
mat1=[1,2,3,4;
5,6,7,8;
9,10,11,12]
并把其保存成一个MAT文件,使用命令:
save matfile1 z mat1
就生成了一个matfile1.mat文件
3. 先把程序写下来
void CMy5Doc::OnOptmatOpen()
{
// TODO: Add your command handler code here
CFileDialog dlgFileOpen(TRUE);
MATFile *pmatFile=NULL;
mxArray *pMxArray=NULL; TCHAR lpstrFilename[MAX_PATH]="";
dlgFileOpen.m_ofn.lpstrFile = lpstrFilename;
TCHAR fileFilter[]="MAT文件\0*.MAT\0所有的文件\0*.*\0";
dlgFileOpen.m_ofn.lpstrFilter = fileFilter;
CString msg;
double *dMat1 = new double;
int m,n;
double *dMat2;
if(dlgFileOpen.DoModal()==IDOK)
{
pmatFile = matOpen(dlgFileOpen.GetFileName(),"r");//A
pMxArray = matGetVariable(pmatFile,"z");//B
dMat1 = (double *)mxGetData(pMxArray);//C
msg.Format("%f",*dMat1);
AfxMessageBox(msg);
pMxArray = matGetVariable(pmatFile,"mat1");
m = mxGetM(pMxArray);
n = mxGetN(pMxArray);//D
msg.Format("M:%d,N:%d",m,n);
AfxMessageBox(msg);
dMat2 = new double[m*n];
dMat2 = (double *)mxGetData(pMxArray);
CString strTmp;
msg = "";
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
strTmp.Format("%f",dMat2[j*m+i]);//E
msg = msg + strTmp + " ";
}
msg = msg + "\n";
}
AfxMessageBox(msg);
matClose(pmatFile);
mxFree(pMxArray);
mxFree(pmatFile);//F
}
}
4. 下面是程序的说明
A:打开一个MAT文件使用函数matOpen(),其定义为:
MATFile *matOpen(const char *filename,const char *mode)
其中mode可以是以下几个:
r:以只读方式打开
u:更新模式,可读可写,但是如果要打开的数据文件不存在,也不会创建新的文件
w:以写入方式打开,只能写如入,如果要打开的数据文件不存在,则创建一个新的文件
B:获得一个MAT文件中的变量,函数matGetVariable()定义为:
mxArray *matGetVariable(MATFile *pMF,const char *name)
由于在MATLAB中所有的变量均看做矩阵,因此返回一个mxArray的指针类型。
C:mxGetData()用于得到矩阵中的具体值,定义为:
void *mxGetData(const mxArray *)
由于返回是void*类型,所以必须强制类型转换为所需要的数据类型。
D:pMxArray = matGetVariable(pmatFile,"mat1");
m = mxGetM(pMxArray);
n = mxGetN(pMxArray);
2,3句用于得到MAT文件中mat1矩阵的行和列,即mat1是一个m×n的矩阵,定义为:
int mxGetM(const mxArray*)
E:由于MATLAB中矩阵是按列存放的,而不是C语言中的按行存放,即存储方式为a[0][0],a[1][0]……a[N][0],a[0] [1],a[1][1]……a[N][1],所以在按行显示矩阵的时候必须使用dMat2[j*m+i]而不是dMat2[i*m+j]。
F:在对文件操作完后,记得要关闭文件,释放资源。使用matClose()可以关闭文件。
mxFree(pMxArray);
mxFree(pmatFile);
这两句执行有问题,我是VS2010环境下。
mxFree(pMxArray);
mxFree(pmatFile);
修改成:
matClose(pmatFile);
mxDestroyArray(pMxArray);
dMat2 = new double[m*n];
dMat2 = (double *)mxGetData(pMxArray);
这两句话有问题。
第一句话执行完后DMat2 指向 new分配的对象
第二句话后DMat2指向mxGetData指向的对象
所以2楼的代码在内存安全上很不严密,可能存在内存泄露问题。