C++导入导出Mat数据格式
解决软件直接通过C++保存doube 类型数组,提供给matlib使用!
C++导入导出Mat数据格式
我在网上寻找如何通过C++保存为Matlib数据格式,网上的内容大多不能用:
1.获取动态链接库
动态链接库在matlib文件夹中,这里我做了一些整理下载如下链接放入运行程序文件夹即可,这里不做过多的解释。需要的可以直接下载https://download.csdn.net/download/CxzKkgg/87450667。
2.文章直接使用DLL调用 导入导出,放好了DLL直接用一下代码
#include <Windows.h>
HINSTANCE matdll, mxdll;
#include "string"
#include "iostream"
#include <vector>
int main() {
std::cout << "start " << std::endl;
matdll = LoadLibrary("libmat.dll"); //加载动态库
mxdll = LoadLibrary("libmx.dll");
if (matdll == nullptr) {
std::cout << "Load library matlab libmat.dll failed.\n" << std::endl;
}
mxdll = LoadLibrary("libmx.dll");
if (mxdll == nullptr) {
std::cout << "Load library matlab libmx.dll failed.\n" << std::endl;
}
class MATFile;
typedef int matError; // 0:succeed; others: failed
typedef MATFile *(*MatOpen)(const char *filename, const char *mode);
typedef matError (*MatClose)(MATFile *pMF);
std::string file = "./3.mat";
//打开文件
MATFile *matfile = nullptr;
MatOpen matOpen = (MatOpen) GetProcAddress(matdll, "matOpen");
if (matOpen != nullptr) {
std::cout << "ss" << std::endl;
matfile = matOpen(file.c_str(), "w");
}
typedef enum { mxREAL=0, mxCOMPLEX } mxComplexity;
class mxArray;
typedef int mwSize;
typedef mxArray* (*MxCreateDoubleMatrix)(mwSize m, mwSize n, mxComplexity flag);
typedef void (*MxSetData)(mxArray* pa, void* newdata);
typedef double* (*MxGetPr)(mxArray *pa);
//这里示例使用一个一维数组10000 个double为例
double out[10000];
for (int i = 0; i < 10000;i++)
{
out[i] = i*0.001;
}
//创建一个matlib类型数组
mxArray* pMxArray = nullptr;
MxCreateDoubleMatrix mxCreateDoubleMatrix = (MxCreateDoubleMatrix)GetProcAddress(mxdll, "mxCreateDoubleMatrix");
if (mxCreateDoubleMatrix != nullptr) {
pMxArray = mxCreateDoubleMatrix(10000, 1, mxREAL);
if (pMxArray == nullptr){
std::cout << "failed !"<< std::endl;
}
}else {
std::cout << "Get function mxCreateDoubleMatrix failed\n" << std::endl;
}
MxGetPr xmxGetPr = (MxGetPr)GetProcAddress(mxdll, "mxGetPr");
if (xmxGetPr == nullptr)
{
std::cout << " faile " << std::endl;
}
//将我们的数组拷入matblib数组
memcpy((void *)xmxGetPr(pMxArray), (void *)out, sizeof(double)*10000);
double *Data;
Data = (double*)xmxGetPr(pMxArray);
for(int i = 0; i< 10000 ;i ++) {
std::cout << Data[i] << std::endl;
}
//这里是mallit的标名字
std::string name = "tr";
typedef matError (*MatPutVariable)(MATFile* pMF, const char* name, const mxArray* pA);
MatPutVariable matPutVariable = (MatPutVariable)GetProcAddress(matdll, "matPutVariable");
if (matPutVariable != nullptr) {
matPutVariable(matfile, name.c_str(), pMxArray);
}
else {
std::cout << "Get function matPutVariable failed\n" << std::endl;
}
MatClose matClose = (MatClose) GetProcAddress(matdll, "matClose");
if (matClose != nullptr) {
if (0 == matClose(matfile)) {
std::cout << "Close %s succeed." << std::endl;
}
}
return 0;
}