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 ...
随机推荐
- 小白的C++之路——简易计算机
#include <iostream> using namespace std; int main() { char link; double num1, num2,num3; cout ...
- T100 GR 报表常见知识点 (含套版制作)
轉載至赫非域 > T100 GR 报表常见知识点 前端操作 bron1984 7小时前 5浏览 0评论 8.9.1 注意事项 字体: 如果字型没选对,会造成没设对字型的数据汇出 PDF 格式乱掉 ...
- Go chan 结构体 写入文件
chan 需要两个进程,一个写,一个读,是分开的, package main import ( "bufio" "fmt" "math/rand&qu ...
- Golang ---testing包
golang自带了testing测试包,使用该包可以进行自动化的单元测试,输出结果验证,并且可以测试性能. 建议安装gotests插件自动生成测试代码: go get -u -v github.com ...
- JAVA-AbstractQueuedSynchronizer-AQS
import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; import java.util.concu ...
- C# 快捷键(总结)
C# 展开和折叠代码的快捷键 VS2005代码编辑器的展开和折叠代码确实很方便和实用.以下是展开代码和折叠代码所用到的快捷键,很常用: Ctrl + M + O: 折叠所有方法 Ctrl + M + ...
- java之spring mvc之Controller配置的几种方式
这篇主要讲解 controller配置的几种方式. 1. URL对应 Bean 如果要使用此类配置方式,需要在XML中做如下样式配置 <!-- 配置handlerMapping --> & ...
- 移动端的touch click事件的理解+点透
移动端在touch上一共有4个事件 touchstart touchmove touchend touchcancel, touchcancel, 一般来说,它们执行的顺序为 touchstart - ...
- html解决空格显示问题
在前端里面,大家都知道,html中输入空格或换行是识别不了是空格的,但是有时候需要实现,那么该如何解决呢?主要有以下几个方面: 1:常用的转义: 2:使用全角拼音,然后输入空格也可实现 3:用标签 ...
- angular http interceptors 拦截器使用分享
拦截器 在开始创建拦截器之前,一定要了解 $q和延期承诺api 出于全局错误处理,身份验证或请求的任何同步或异步预处理或响应的后处理目的,希望能够在将请求移交给服务器之前拦截请求,并在将请求移交给服务 ...