C++调用.mat文件

我的计算机环境是win10 64位系统,VS2019,matlab R2012a。
感觉工程配置跟编写mex的文件的部分工程类似。关键是要调用matlab里已经被别人封装好的方法。

一、工程配置:

  • 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
  • 4.顶菜单->生成->配置管理器->平台:X64(由于所安装的matlab为64位,要调用其函数,需要将工程转换为X64)
  • 5.链接器->高级->目标计算机:
    MachineX64(/MACHINE:X64)
  • 6.修改计算机环境变量->path 添加:
    *\MATLAB\R2010b\extern\lib\win64\microsoft;
    *\MATLAB\R2010b\bin\win64;
    (如果不行,试试修改环境变量后,关机重启)

二、所用到的基本读取mat文件代码示例:

首先需要包含头文件:#include

#include “mat.h”
	MATFile *pmatFile = NULL;
	mxArray *pMxArray = NULL;
	double *initA;
	pmatFile = matOpen("mc_svm.mat", "r");
	pMxArray = matGetVariable(pmatFile, "A");
	initA = (double*)mxGetData(pMxArray);
	int M, N;
	M = mxGetM(pMxArray);
	N = mxGetN(pMxArray);
	for (int i = 0; i < M; i++) {
     
		for (int j = 0; j < N-1; j++) {
     
			pArray[i+j*M] = initA[M*j + i];
		}
		pArray1[i] = initA[M*(N-1) + i];
	}
	matClose(pmatFile);
	mxFree(initA);

三、所用到的基本写入mat文件代码示例:

MATFile *pmatFile;
	mxArray *pMxArray;
	pmatFile = matOpen("result.mat", "w");
	pMxArray = mxCreateDoubleMatrix(data_m, data_lei, mxREAL);
	//mxSetData(pMxArray, model_->alpha);
	memcpy((mxGetPr(pMxArray)), model_->alpha, sizeof(double)*data_m*data_lei);
	matPutVariable(pmatFile, "alpha", pMxArray);
	pMxArray = mxCreateDoubleMatrix(data_m,1, mxREAL);
	memcpy((mxGetPr(pMxArray)), model_->beta, sizeof(double)*data_m);
	matPutVariable(pmatFile, "beta", pMxArray);

其中一些方法有:

  • 1.使用matOpen函数打开mat文件
    MATFile *matOpen(const char *filename,const char *mode)
    文件名试试使用路径D:\\Science_study\\code vs2010\\Project1\\Project1\\
    mode:
    r:以只读方式打开
    u:更新模式,可读可写,但是如果要打开的数据文件不存在,也不会创建新的文件
    w:以写入方式打开,只能写如入,如果要打开的数据文件不存在,则创建一个新的文件
  • 2.使用matGetVariable函数读取mat文件中的变量
    mxArray * matGetVariable(MATFile * pMF, const char * name);
    读取名为name的变量,返回一个数据阵列指针
  • 3.使用mxGetData函数获取数据阵列中的数据
    void *mxGetData(const mxArray *pa );
    返回时需要使用强制类型转换。
  • 4.使用mxGetM和mxGetN函数获取数据阵列矩阵的维数
    size_t mxGetM(const mxArray *pa);
    size_t mxGetN(const mxArray *pa);
  • 5.使用mxCreateDoubleMatrix函数创建数据阵列为双浮点数矩阵
    mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n,mxComplexity flag);
  • 6.使用mxSetData函数将变量存入数据阵列
    void mxSetData( mxArray *pa, void *newdata );
  • 7.使用matPutVariable函数将数据阵列存入到mat文件中
    int matPutVariable(MATFile * pMF, const char * name, const mxArray * pA);
    存入成功返回0,存入出错返回非0
  • 8.由于malab中矩阵的存储是按列存储,与c中不同,所以从mat文件中获取的矩阵需要重新排列。生成mat文件时,同样要注意。
  • 9.完成mat文件操作后需要调用matClose函数关闭文件,并使用mxFree释放内存

你可能感兴趣的:(matlab)