网站是由哪些组成的:vc对.mat文件的读取

来源:百度文库 编辑:中财网 时间:2024/05/09 03:56:39

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  {
   for(int j=0;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()可以关闭文件。