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()可以关闭文件。
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()可以关闭文件。
相关文章推荐
- 用VC6读写MATLAB的.mat文件(转)
- Matlab VC 联合编程 控制台以及MFC中实现(四)
- Qt+opencv+matlab opencv读写高光谱 .mat文件
- C++读写matlab的mat文件 结合opencv Mat结构测试
- Matlab VC 联合编程 控制台以及MFC中实现(三)
- C++读写.mat文件的方法——C配置MATLAB部分
- Matlab VC 联合编程 控制台以及MFC中实现(五)
- 读写SQL Server的binary类型(VC/MFC)
- 接触VC之二:MFC类基础,C++程序编写规范
- Python 读写matlab中.mat文件
- 【MFC】VC读写ini文件
- Matlab与VC混合编程之二
- Matlab VC 联合编程 控制台以及MFC中实现(一)
- [转][VC/MFC]关于内存映射文件技术处理大文件的读写-例
- matlab 7与vc/mfc混合编程 脱离运行环境,移植代码
- [转][VC/MFC]关于内存映射文件技术处理大文件的读写
- VC读写Excel MFC读写Excel 考勤数据
- C++读写matlab数据.mat文件
- matlab引擎成功在VC++中运行(VC++6.0 MFC)
- WIN32、MFC、VC、INI文件读写API