整理VS_2010读写.mat文件

来源:互联网 发布:ubuntu识别u盘设备 编辑:程序博客网 时间:2024/06/09 17:16

有时用到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.csdn.net/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);*/}


0 0