您的位置:首页 > 编程语言 > MATLAB

MFC之二——VC++读写MATLAB的.mat文件

2010-01-04 17:41 323 查看
原帖出处:http://my507.blog.sohu.com/131807911.html

1、选VC的菜单Tools->Options,在弹出对话框中点选Directories标签,在右方的下拉菜单中选择Include files,然后在下方列表中添加($MATLAB$)externinclude;再在右方的

下拉菜单中选择Library files,然后在下方列表中添加($MATLAB$)externlibwin32microsoftmsvc60。

注:上面的($MATLAB$)以计算机中MATLAB的安装位置替换;如果使用的VC版本是5.0,则把列表中添加路径中的msvc60替换成msvc50即可。

2、对于需要操作.mat文件的工程,选择菜单Project->Settings,在弹出对话框中点选Link标签,在Object/library modules中加入 libmx.lib libmat.lib。下面是程序中的调用

,以例子说明用法,必要时候如用到mxArray时候还要加入sgl.lib libmatlbmx.lib。

3、一定要加入 #include "mat.h" ,如果要对mxArray进行操作,加入 #include "matlab.h" 。具体的mfc程序的例子见“e:.....StaticDraw”工程。

**VC中读取MATLAB的.MAT文件
**在VC中要读取MATLAB的.MAT文件是要费点工夫的,下面是详细步骤,以MATLAB7为例.

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
[0],a[0][1],a[1][1]……a
[1],所以在按行显示矩阵的时候必须使用

dMat2[j*m+i]而不是dMat2[i*m+j]。

F:在对文件操作完后,记得要关闭文件,释放资源。使用matClose()可以关闭文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: