c++读写matlab中.mat数据
前言:在进行图形图像处理时,经常会用到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数据的更多相关文章
- 两分钟解决Python读取matlab的.mat数据
Matlab是学术界非常受欢迎的科学计算平台,matlab提供强大的数据计算以及仿真功能.在Matlab中数据集通常保存为.mat格式.那么如果我们想要在Python中加载.mat数据应该怎么办呢?所 ...
- matlab中mat文件简单存/取
>>abc=[,,,,,]; >>save data save file_name:命令可以将当前项目中变量的值保存到file_name中去,这里的data文件就是mat文件. ...
- matlab中图片数据类型转换uint8与double
matlab中处理图像像素点数据: img1=double(imread('lenna.bmp')); matlab中imshow图片,要先转换成uint8: subplot(1,2,1),imsho ...
- C#实现读写文本文件中的数据
[1]首先我们定义一段假数据,这里以一个string为例字 static void Main(string[] args) { string data = &quo ...
- MATLAB中导入数据:importdata函数
用load函数导入mat文件大家都会.可是今天我拿到一个数据,文件后缀名竟然是'.data'.该怎么读呢? 我仅仅好用matlab界面Workspace区域的"import data&quo ...
- OpenCV中Mat数据的访问报错
最近再写一段程序的时候,要访问Mat中的元素.在定义Mat型数据的时候,用 Mat ObjectPoints(48,3,CV_32FC1,0) 对其进行初始化后,用at进行访问时报内存错误. Mat ...
- 【转】Java读取matlab的.mat数据文件
参考:Java读取mat文件 下载链接:ujmp jmatio 下载完两个.jar文件之后,如何引用到java项目当中?项目名称->右键->Property->Java Build ...
- 利用java反射读写csv中的数据
前一段有个需求需要将从数据库读取到的信息保存到csv文件中,在实现该需求的时候发现资料比较少,经过收集反射和csv相关资料,最终得到了如下程序. 1.在使用java反射读取csv文件数据时,先通 ...
- 使用json读写文件中的数据
把json的数据写入到文件中 import json with open('data.json','w+') as f: json.dump({"name":"张彪&qu ...
随机推荐
- python学习-29 map函数-filter函数
movie_person = ['小红','小明','小王','富豪_sb','美女_sb'] def filter_test(array): ret = [] for i in array: if ...
- DRF框架(四)——单整体改(put)、单局部改(patch)、群局部改(patch)
单整体改 单指的是单独一条数据,整体指这条数据的所有字段都必须传值修改 基于上篇文章的代码修改,序列化层不用变,只修改views.py 1) 单整体改,说明前台要提供修改的数据,那么数据就需要校验 ...
- redis源码分析(一)-sds实现
redis支持多种数据类型,sds(simple dynamic string)是最基本的一种,redis中的字符串类型大多使用sds保存,它支持动态的扩展与压缩,并提供许多工具函数.这篇文章将分析s ...
- vue的特殊指令 v-if v-once v-bind v-for v-on v-model
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【题解】Luogu P5361 [SDOI2019]热闹又尴尬的聚会
原题传送门 构造题. 明显p,q都越大越好 我们考虑每次取出度最小的点,加到尴尬聚会的集合中(因为把与它相邻的点全删了,不珂能出现认识的情况),把它自己和与自己相连的点从图上删掉(边也删掉),记下这个 ...
- Oracle将小于1的数字to_char后,丢掉小数点前0的解决办法
使用to_char方法将小于0的数字转化为字符串时会出现小数点前0丢失的问题: 解决方案: 使用 oracle的tochar() 函数,并指定位数. --解决方案: 使用 oracle的tochar( ...
- linux 不能进入系统 Failed to load SELinux policy. Freezing
错误原因 配置关闭SELinux,结果误操作 应修改配置文件/etc/selinux/config中的“SELINUX”参数的值, # SELINUX=enforcing 原始配置 SELINUX=d ...
- ES6 新增基本数据类型Symbol
ES6 增加了一个新的基本数据类型 symbol. 不过,和其他基本数据类型相比,它有点与众不同,因为它没有字面量的表现形式,而且创建的方式也有点奇怪,只能通过调用全局函数Symbol()来完成. l ...
- nginx-1.12.0安装
1.配置相关环境: yum install -y gcc glibc gcc-c++ zlib pcre-devel openssl-devel rewrite模块需要pcre库 ssl功能需要ope ...
- RSA加密&解密【Java&Scala】
一.简介 RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用. RSA公开密钥密码体制.所谓公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解 ...