C++导入导出Mat数据格式

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tbbei.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值