静态库链接方式
网络上关于c++链接静态库的方法有很多,例如
https://blog.csdn.net/left_la/article/details/8206645
动态库链接方式
动态库不需要在VS中进行另外的设置,但调用起来比较麻烦,与读写mat文件和数据相关的动态库包括两个,libmat.dll和libmx.dll。
动态库的导入
#include <Windows.h>
HINSTANCE matdll, mxdll;
matdll = LoadLibrary("libmat.dll");
if (matdll == nullptr) {
printf("Load library matlab libmat.dll failed.\n");
return;
}
mxdll = LoadLibrary("libmx.dll");
if (mxdll == nullptr) {
printf("Load library matlab libmx.dll failed.\n");
return;
}
函数的位置
一般来讲,mx开头的函数均在libmx.dll库中,其他函数在libmat.dll库中
文件打开关闭
文件打开关闭函数在动态库libmat.dll中
class MATFile;
typedef int matError; // 0:succeed; others: failed
typedef MATFile* (*MatOpen)(const char* filename, const char* mode);
typedef matError (*MatClose)(MATFile* pMF);
//string file;
//打开文件
MATFile *matfile = nullptr;
MatOpen matOpen = (MatOpen)GetProcAddress(matdll, "matOpen");
if (matOpen != nullptr) {
matfile = matOpen(file.c_str(), "w");
if (matfile == nullptr) {
printf("Open %s failed\n", file.c_str());
false;
}
else {
printf("Open %s succeed.\n", file.c_str());
}
}
else {
printf("Get function MatOpen failed.\n");
false;
}
}
/*向文件中写入数据*/
// 关闭文件
MatClose matClose = (MatClose)GetProcAddress(matdll, "matClose");
if (matClose != nullptr) {
if(0 == matClose(matfile)){
printf("Close %s succeed.", file.c_str());
}
else {
printf("Close %s failed.", file.c_str());
}
}
else {
printf("Get function matClose failed.\n");
return;
}
数据写入
这里以写入double数组为例,其他类型数据写入函数可查阅文档
mat文件中的数据一般存储在mxArray对象中,本节介绍如何向mxArray中填充我们的数据(一个一维数据,长度为len)
- 准备mxArray空间,通过调用mxCreateDoubleMatrix实现
typedef enum { mxREAL, mxCOMPLEX } mxComplexity;
class mxArray;
typedef int mwSize;
typedef mxArray* (*MxCreateDoubleMatrix)(mwSize m, mwSize n, mxComplexity flag);
mxArray* pMxArray = nullptr;
MxCreateDoubleMatrix mxCreateDoubleMatrix = (MxCreateDoubleMatrix)GetProcAddress(mxdll, "mxCreateDoubleMatrix");
if (mxCreateDoubleMatrix != nullptr) {
pMxArray = mxCreateDoubleMatrix(len, 1, mxREAL);
if (pMxArray == nullptr) return;
}
else {
printf("Get function mxCreateDoubleMatrix failed\n");
return;
}
- 向mxArray中填充数据
typedef void (*MxSetData)(mxArray* pa, void* newdata);
MxSetData mxSetData = (MxSetData)GetProcAddress(mxdll, "mxSetData");
if (mxSetData != nullptr) {
mxSetData(pMxArray, data); // double data[len];
}
else {
printf("Get function mxSetData failed\n");
return;
}
- 向文件中写入mxArray数据
通过调用matPutVariable函数将mxArray对象写入文件中
typedef matError (*MatPutVariable)(MATFile* pMF, const char* name, const mxArray* pA);
MatPutVariable matPutVariable = (MatPutVariable)GetProcAddress(matdll, "matPutVariable");
if (matPutVariable != nullptr) {
return 0 == matPutVariable(matfile, name.c_str(), pMxArray);
}
else {
printf("Get function matPutVariable failed\n");
return false;
}