前言:在进行图形图像处理时,经常会用到matlab进行算法的仿真验证,然后再移植到别的语言中。有时会涉及到数据的交互,比如直接读取matlab的.mat类型数据,或者是将c++中的数组存为.mat,为了使用方便,这里介绍一下c++对.mat的读写。

一、工程配置:

1、附加包含目录:
D:\MATLAB\extern\include

2、附加库目录:

D:\MATLAB\extern\lib\win64\microsoft

3、附加依赖库:
libmat.lib
libmx.lib
libmex.lib
libeng.lib

4、计算机环境变量->path 添加:

D:\MATLAB\bin\win64;

5、其他:

  • 上述路径应改为自己的路径。
  • C++工程解决方案平台应与matlab版本一致

二、存储.mat

直接上代码:

#include <string.h>
#include <iostream>
#include <stdio.h>
#include <mat.h>
using namespace std; template<typename T>
bool SaveMatlabMat(T *src,string savePath,string matrixName,int width,int height)
{
//转置存储
int datasize = width * height;
double *Final = new double[datasize];//待存储数据转为double格式
memset(Final, , datasize * sizeof(double));
for (int i = ; i < height; i++)
{
for (int j = ; j < width; j++)
{
Final[i*width+j] = double(src[i*width+j]);
}
}
mxArray *pWriteArray = NULL;//matlab格式矩阵
MATFile *pmatFile = NULL;//.mat文件指针
pmatFile = matOpen(savePath.c_str(), "w");
if (pmatFile == nullptr)
{
printf("mat save path is error");
return false ;
}
//创建一个width*height的矩阵
pWriteArray = mxCreateDoubleMatrix(width, height, mxREAL);
//把data的值赋给pWriteArray指针
memcpy((void *)(mxGetPr(pWriteArray)), (void *)Final, sizeof(double) * datasize);
//给矩阵命名为matrixName
matPutVariable(pmatFile, matrixName.c_str(), pWriteArray);
matClose(pmatFile);
mxDestroyArray(pWriteArray);//release resource
delete[]Final;//release resource return true;
} int main()
{
int width=;
int height=;
int *array = new int[width*height];//初始化一个height*width的二维矩阵
memset(array,,sizeof(int)*width*height);
for (int i = ; i < height; i++)
{
for (int j = ; j < width; j++)
{
array[i*width + j] = i*width + j;
}
}
string filePath = "aa.mat";//文件名字
string matrixName = "aa";//文件内矩阵名
SaveMatlabMat(array,filePath, matrixName,width,height); return ;
}

  代码运行完会在当前目录下发现“aa.mat”文件,用matlab打开后如下图所示:

  可以发现与c++中矩阵为转置关系,这是因为matlab中的数据是按列存储的,而c++中是按行存储的。前面我初始化的c++矩阵中第一行为0~2591,在matlab中存为第一列。这在实际使用中很不方便,为了消除这种转置关系,我们只需在把数据存入Final时提前进行转置,附上代码如下:

template<typename T>
bool SaveMatlabMat(T *src, string savePath, string matrixName, int width, int height)
{
//转置存储
int datasize = width * height;
double *Final = new double[datasize];//待存储数据转为double格式
memset(Final, , datasize * sizeof(double));
for (int i = ; i < height; i++)
{
for (int j = ; j < width; j++)
{
Final[j*height+i] = double(src[i*width + j]);
}
}
mxArray *pWriteArray = NULL;//matlab格式矩阵
MATFile *pmatFile = NULL;//.mat文件指针
pmatFile = matOpen(savePath.c_str(), "w");
if (pmatFile == nullptr)
{
printf("mat save path is error");
return false;
}
//创建一个height*width的矩阵
pWriteArray = mxCreateDoubleMatrix(height, width, mxREAL);
//把data的值赋给pWriteArray指针
memcpy((void *)(mxGetPr(pWriteArray)), (void *)Final, sizeof(double) * datasize);
//给矩阵命名为matrixName
matPutVariable(pmatFile, matrixName.c_str(), pWriteArray); matClose(pmatFile);//close file
mxDestroyArray(pWriteArray);//release resource
delete[]Final;//release resource return true;
}

这样,便使得写入的.mat文件和c++矩阵格式保持一致。

三、读取.mat

  与写入一样,由于matlab按列存储数据,c++读取时也是读取matlab的第一列数据,因此读取时也要考虑转置关系,这里直接附上代码,读取我们刚刚存储的aa.mat。

template<typename T>
bool ReadMatlabMat(T *dst, string filePath,string matrixName, int width, int height)
{
MATFile *pmatFile = NULL;
mxArray *pMxArray = NULL;
double *matdata;
pmatFile = matOpen(filePath.c_str(), "r");//打开.mat文件
if (pmatFile == NULL)
{
printf("filePath is error");
return false;
}
pMxArray = matGetVariable(pmatFile, matrixName.c_str());//获取.mat文件里面名为matrixName的矩阵
matdata = (double *)mxGetData(pMxArray);//获取指针
matClose(pmatFile);//close file for (int i = ; i < height; i++)
{
for (int j = ; j < width; j++)
{
dst[i*width+j] = T(matdata[j*height + i]);
}
}
mxDestroyArray(pMxArray);//释放内存
matdata = NULL;
return ;
}

c++读写matlab中.mat数据的更多相关文章

  1. 两分钟解决Python读取matlab的.mat数据

    Matlab是学术界非常受欢迎的科学计算平台,matlab提供强大的数据计算以及仿真功能.在Matlab中数据集通常保存为.mat格式.那么如果我们想要在Python中加载.mat数据应该怎么办呢?所 ...

  2. matlab中mat文件简单存/取

    >>abc=[,,,,,]; >>save data save file_name:命令可以将当前项目中变量的值保存到file_name中去,这里的data文件就是mat文件. ...

  3. matlab中图片数据类型转换uint8与double

    matlab中处理图像像素点数据: img1=double(imread('lenna.bmp')); matlab中imshow图片,要先转换成uint8: subplot(1,2,1),imsho ...

  4. C#实现读写文本文件中的数据

    [1]首先我们定义一段假数据,这里以一个string为例字 static void Main(string[] args)        {            string data = &quo ...

  5. MATLAB中导入数据:importdata函数

    用load函数导入mat文件大家都会.可是今天我拿到一个数据,文件后缀名竟然是'.data'.该怎么读呢? 我仅仅好用matlab界面Workspace区域的"import data&quo ...

  6. OpenCV中Mat数据的访问报错

    最近再写一段程序的时候,要访问Mat中的元素.在定义Mat型数据的时候,用 Mat ObjectPoints(48,3,CV_32FC1,0) 对其进行初始化后,用at进行访问时报内存错误. Mat ...

  7. 【转】Java读取matlab的.mat数据文件

    参考:Java读取mat文件 下载链接:ujmp  jmatio 下载完两个.jar文件之后,如何引用到java项目当中?项目名称->右键->Property->Java Build ...

  8. 利用java反射读写csv中的数据

      前一段有个需求需要将从数据库读取到的信息保存到csv文件中,在实现该需求的时候发现资料比较少,经过收集反射和csv相关资料,最终得到了如下程序.  1.在使用java反射读取csv文件数据时,先通 ...

  9. 使用json读写文件中的数据

    把json的数据写入到文件中 import json with open('data.json','w+') as f: json.dump({"name":"张彪&qu ...

随机推荐

  1. Mesh网格简化

    Mesh简化算法: 1. 通过mesh简化,可以将一个多边形的网格A转化成另一个网格B 网格B相比A,有更少的三角形面.边.顶点. 2. 简化的过程是受到一定的约束的.会有一系列自定义的质量标准来控制 ...

  2. Django框架(十三)——Auth模块

    Auth模块 一.什么是auth模块 Auth模块是Django自带的用户认证模块 Auth模块是Django自带的用户认证模块,可以实现包括用户注册.用户登录.用户认证.注销.修改密码等功能.默认使 ...

  3. 简单的爬虫程序以及使用PYQT进行界面设计(包含源码解析)

    由于这个是毕业设计的内容,而且还是跨专业的.爬虫程序肯定是很简单的,就是调用Yahoo的API进行爬取图片.这篇博客主要讲的是基础的界面设计. 放上源码,然后分部解析一下重要的地方.注:flickra ...

  4. AVR单片机教程——旋转编码器

    好久没写这个系列了.今天讲讲旋转编码器. 旋转编码器好像不是单片机玩家很常用的器件,但是我们的开发板上有,原因如下: 旋转编码器挺好用的.电位器能旋转的角度有限,旋转编码器可以无限圈旋转:旋转时不连续 ...

  5. C#:蓝牙串口读数据和写数据

    首次使用C#编写与COM口有关的程序,期间遇到了很多问题,写下自己的经验总结,如有错漏,欢迎批评指正! 1.新建一个串口类( SerialPort类) //Create a serial port f ...

  6. mongodb常规操作语句

    db.c_user.insertOne({ name: "ljm", pwd: "123456" }); //插入一个 db.c_user.insertMany ...

  7. MSP---企业上云需要考虑的问题

    一.评估 1.应用是否可以上云: 2.时间:规划时间,迁移时间 2.成本:人力成本,资源成本 二.上云 1.如何上云:选择云厂商,选择MSP 2.云选择:公有云,私有云,混合云,多云(不要最贵的,也不 ...

  8. MySQL数据库之互联网常用架构方案

    一.数据库架构原则 高可用 高性能 一致性 扩展性 二.常见的架构方案 方案一:主备架构,只有主库提供读写服务,备库冗余作故障转移用 jdbc:mysql://vip:3306/xxdb 高可用分析: ...

  9. springCloud学习笔记2(服务发现)

    本篇代码存放于:https://github.com/FleyX/demo-project/tree/master/springcloud/spring-cloud%E6%9C%8D%E5%8A%A1 ...

  10. JavaScript变量存储浅析(一)

    Hello! 上一篇关于JS中函数传参(http://www.cnblogs.com/souvenir/p/4969092.html)的介绍中提到了JS的另外一个基本概念:JS变量存储, 今天我们就用 ...