有时用到VS读写.mat文件,所以结合自己的操作过程,整理出如下的操作步骤
1.首先是环境变量Path的配置
计算机->属性->高级系统设置->高级->环境变量
在Path中已经存在D:\MATLAB_2011a\R2011a\bin\,但是D:\MATLAB_2011a\R2011a\bin\win32下有个重要的libmat.dll。如果不把D:\MATLAB_2011a\R2011a\bin\改为 D:\MATLAB_2011a\R2011a\bin\win32,程序无法运行。
理论上D:\MATLAB_2011a\R2011a\bin\应该会向深一步检索到libmat.dll。坑爹的windows这一步并有去做。这步设置完成后要重启电脑。
2.VS 2010配置
//新建一个工程,在属性管理器中选择 工程->属性->VC++目录。
//设置 包含目录为:D:\MATLAB_2011a\extern\include
//设置 库目录为: D:\MATLAB_2011a\extern\lib\win32\microsoft
上面的3条设置并不是必须的,所以用//表示出
1).工程属性->C/C++->常规->附加包含目录 添加:
MATLAB\R2010b\extern\include
MATLAB\R2010b\extern\include\win64
2).链接器->常规->附加库目录 添加:
MATLAB\R2010b\extern\lib\win64\microsoft
MATLAB\R2010b\extern\lib\win32\microsoft
3).链接器->输入->附加依赖库 添加:
libmat.lib
libmx.lib
libmex.lib
libeng.lib
由于所安装的matlab为64位,要调用其函数,需要将工程转换为X64
4).(顶菜单)生成->配置管理器->平台:X64
5).链接器->高级->目标计算机:
MachineX64(/MACHINE:X64)
6).计算机环境变量->path 添加:
D:\...\MATLAB\R2010b\extern\lib\win64\microsoft;
D:\...\MATLAB\R2010b\bin\win64;
利用MATLAB提供的有关mat文件的编程接口函数,MATLAB的库函数中包含了mat文件接口函数库,其中有各种对mat文件进行读写的函数,都是以mat开头的函数。
/*
这个文件代码是用VS_2010读写由MATLAB生成的.mat文件:
1.整个代码的实现是参考网上《C++读写.mat文件》的一篇博客
网址为http://blog.youkuaiyun.com/left_la/article/details/8206645
2.首先对于VS_2010的整个配置是完全参照博客的内容
配置时同时参考http://www.360doc.com/content/14/0408/16/15831056_367275320.shtml
《使用VS2010调用matlab的mat格式文件》的文章,尤其注意此文章中的红色字体部分。
3.对于原博客内容中的第12行代码“Matrix<double> A(M,N);”编译通不过,对此作了修改,
用了Eigen的结构,所以头文件部分也加入了一些
4.因为目前还用不到写.mat文件,所以没调试
*/
#include <yvals.h>
#include <iostream>
#if (_MSC_VER >= 1600)
#define __STDC_UTF_16__
#endif
#include <mat.h>
#include <Eigen/Core>
int main()
{
MATFile *pmatFile = NULL;
mxArray *pMxArray = NULL;
// 读取.mat文件(例:mat文件名为"initUrban.mat",其中包含"initA")
double *initA;
pmatFile = matOpen("B.mat","r");
pMxArray = matGetVariable(pmatFile, "b");
initA = (double*) mxGetData(pMxArray);
int M = mxGetM(pMxArray);
int N = mxGetN(pMxArray);
Eigen::MatrixXd A(M,N);
for (int i=0; i<M; i++)
{
for (int j=0; j<N; j++)
A(i,j) = initA[M*j+i];
}
matClose(pmatFile);
mxFree(initA);
std::cout << M<<','<<N<< std::endl;
std::cout << A << std::endl;
/*
// 生成.mat文件
double *outA = new double[M*N];
for (int i=0; i<M; i++)
for (int j=0; j<N; j++)
outA[M*j+i] = A(i,j);
pmatFile = matOpen("A.mat","w");
pMxArray = mxCreateDoubleMatrix(M, N, mxREAL);
mxSetData(pMxArray, outA);
matPutVariable(pmatFile, "A", pMxArray);
matClose(pmatFile);
*/
}