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 <stdio.h>
#include <stdlib.h>
#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:"<<file<<endl;
return(1);
}
dir = (const char **)matGetDir(pmat, &ndir);
//ndir 表示mat文件中含有矩阵数目
if (dir == NULL) {
cout<<"Error reading directory of file:"<<file<<endl;
return(1);
}
else
{
cout<<"Directory of file:"<<file<<endl;
for (i=0; i < ndir; i++)
cout<<dir[i]<<endl;//输出所含矩阵数目
}*/
pmat=matOpen(file, "r");//重新打开文件
pa = matGetNextVariable(pmat, &name);
//返回指向文件头文件信息的指针,指针类型为*mxArray
//name 是矩阵的名字
cout<<name<<endl;
pmat=matOpen(file, "r");
int ii=mxGetM(pa);//矩阵行数
int jj=mxGetN(pa);//矩阵列数
pm=mxGetPr(pa); //获取矩阵数值,返回指向矩阵第一数值的指针
cout<<*(pm++)<<endl;//输出数据
cout<<*(pm++)<<endl; //输出数据
// cout<<*(pm++)<<endl;…
mxFree(dir);
return(1);
}
C++读取mat文件:
1.vs2010的配置
新建一个工程,在属性管理器中选择Debug|Win32->Microsoft.Cpp.Win32.user->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文件中 |
matGetVariableInfo |
从MAT文件中读取MATLAB阵列头信息 |
matGetNextVariableInfo |
从MAT文件中读取下一个MATLAB阵列头信息 |
4.程序举例:
D盘下有一个test.mat文件。代码如下:
#include "mat.h"
#include <stdio.h>
//下面两行参数很重要,没有的话就会出现类似unresolved external symbol _matClose referenced in function _main的请况
//另一种方法就是:
对于需要操作.mat文件的工程,选择菜单Property->linker,在弹出对话框中点选Link标签,在Additional Dependencies中加入 libmx.lib、libmat.lib。下面是程序中的调用,以例子说明用法,必要时候如用到mxArray时候还要加入sgl.lib 和 libmatlbmx.lib。
#pragma comment(lib,"libmat.lib")
#pragma comment(lib,"libmx.lib")
int main()
{
MATFile *pmat;
const char **dir;
const char *file;
const char *name;
int ndir;
mxArray *pa;
file="D:\\test.mat"; //双反斜杠防止转义
pmat=matOpen(file, "r");//打开文件,返回指向文件指针
if (pmat == NULL)
{
printf("pmat==NULL");//cout<<"Error opening file:" <<file<<endl;
return(1);
}
dir = (const char **)matGetDir(pmat, &ndir);
//ndir 表示mat文件中含有矩阵数目
if (dir == NULL)
{
printf("Error reading directory of file:");
return(1);
}else
{
printf("Directory of %s\n",file);
for (int i=0; i < ndir; i++)
printf("%s\n",dir[i]);//输出所含矩阵数目
}
return 0;
}