C++读写.mat文件

使用C/C++读写.mat文件(Clion) 使用C/C++读写.mat文件(Clion) 最近需要使用C++来处理matlab生成的数据, 参考了网上一些博客,不过他们都是使用的VS,我比较喜欢使用Clion, 在配置的过程中也遇到了一些坑,记录一下。 一、创建工程并添加测试代码 创建工程就不说了,注意一下我使用的编译工具链是MinGW。测试代码参考的matlab官方的程序:读取用 C/C++ 编写的 MAT 文件 - MATLAB & Simulink - MathWorks 中国,对官方的代码进行了小小的调整。 将程序中的path替换为. 阅读详情

最近在编写C++程序的过程中,需要使用matlab生成的.mat文件,于是查找了基本使用方法。

我的计算机环境是win7 64位系统,VS2010,matlab R2010b。

一、工程配置:
1.C/C++->常规->附加包含目录 添加:
MATLAB\R2010b\extern\include
MATLAB\R2010b\extern\include\win64
2.链接器->常规->附加库目录 添加:
MATLAB\R2010b\extern\lib\win64\microsoft
MATLAB\R2010b\extern\lib\win32\microsoft
3.链接器->输入->附加依赖库 添加:
libmat.lib
libmx.lib
libmex.lib
libeng.lib

由于所安装的matlab为64位,要调用其函数,需要将工程转换为X64
4.顶菜单->生成->配置管理器->平台:X64
5.链接器->高级->目标计算机:
MachineX64(/MACHINE:X64)

6.计算机环境变量->path 添加:
E:\DevTools\MATLAB\R2010b\extern\lib\win64\microsoft;
E:\DevTools\MATLAB\R2010b\bin\win64;

二、所用到的基本读取写入mat文件代码示例:

首先需要包含头文件:

#include <mat.h>

MATFile *pmatFile = NULL;
mxArray *pMxArray = NULL;

// 读取.mat文件(例:mat文件名为"initUrban.mat",其中包含"initA")
double *initA;

pmatFile = matOpen("initUrban.mat","r");
pMxArray = matGetVariable(pmatFile, "initA");
initA = (double*) mxGetData(pMxArray);
M = mxGetM(pMxArray);
N = mxGetN(pMxArray);
Matrix<double> A(M,N);
for (int i=0; i<M; i++)
	for (int j=0; j<N; j++)
		A[i][j] = initA[M*j+i];

matClose(pmatFile);
mxFree(initA);

// 生成.mat文件
double *outA = new double[M*N];
	for (int i=0; i<M; i++)
		for (int j=0; j<N; j++)
			outA[M*j+i] = A[i][j];
pmatFile = matOpen("A.mat","w");
pMxArray = mxCreateDoubleMatrix(M, N, mxREAL);
mxSetData(pMxArray, outA);
matPutVariable(pmatFile, "A", pMxArray);
matClose(pmatFile);

三、程序说明

1.使用matOpen函数打开mat文件

MATFile *matOpen(const char *filename,const char *mode)

mode:
r:以只读方式打开
u:更新模式,可读可写,但是如果要打开的数据文件不存在,也不会创建新的文件
w:以写入方式打开,只能写如入,如果要打开的数据文件不存在,则创建一个新的文件


2.使用matGetVariable函数读取mat文件中的变量

mxArray * matGetVariable(MATFile * pMF, const char * name);

读取名为name的变量,返回一个数据阵列指针


3.使用mxGetData函数获取数据阵列中的数据

void *mxGetData(const mxArray *pa );

返回时需要使用强制类型转换。


4.使用mxGetM和mxGetN函数获取数据阵列矩阵的维数

size_t mxGetM(const mxArray *pa);

size_t mxGetN(const mxArray *pa);


5.使用mxCreateDoubleMatrix函数创建数据阵列为双浮点数矩阵

mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity flag);


6.使用mxSetData函数将变量存入数据阵列

void mxSetData( mxArray *pa, void  *newdata );


7.使用matPutVariable函数将数据阵列存入到mat文件中

int matPutVariable(MATFile * pMF, const char * name, const mxArray * pA);

存入成功返回0,存入出错返回非0


8.由于malab中矩阵的存储是按列存储,与c中不同,所以从mat文件中获取的矩阵需要重新排列。生成mat文件时,同样要注意。


9.完成mat文件操作后需要调用matClose函数关闭文件,并使用mxFree释放内存

利用c++解析*.mat格式文件 MAT文件是MATLAB使用的二进制数据文件格式,可以存储变量、矩阵、结构体等多种数据类型。要在C++中读取这些文件,我们需要使用MathWorks提供的库或第三方库。通过本文介绍的方法,你可以在C++项目中有效地读取和处理MATLAB的.mat文件。这对于需要在C++环境中使用MATLAB生成的数据的开发者特别有用。本篇主要讲了libmat-io库的配置和使用过程,提供了相关示例。希望对你有所帮助。 阅读详情

相关推荐

C++读写matlab的mat文件 结合opencv Mat结构测试

最近opencv工程有需要用到matlab的mat文件,遂研究整理如下: 工程配置: 1.包含目录:matlab安装目录\extern\include\win64 2.库目录:matlab安装目录\extern\lib\win64\microsoft 3.链接器->附加依赖项:libmat.lib  libmx.lib  libmex.lib  libeng.lib(四个)

zhaohsww的专栏 7426

C++ 读取 .mat 文件

#define CPU_ONLY #include&lt;vector&gt; #include&lt;iostream&gt; #include&lt;caffe/caffe.hpp&gt; #include&lt;opencv2/opencv.hpp&gt; #include "caffe_reg.h" #include&lt;mat.h&gt; using namespace caffe...

机器学习的小学生 5751

c++读写txt文件 matlab读mat文件

#include &lt;fstream&gt; #include &lt;iostream&gt; using namespace std; int main() { int a[10]; ifstream in("1.txt");//读入 for(int i=0;i&lt;10;i++) in&gt;&gt;a[i]; for(int i=0;i&lt;10;i++) cou...

xhyan523的博客 711

c++ mat赋值_C++读写.mat文件的方法

最近在编写C++程序的过程中,需要使用matlab生成的.mat文件,于是查找了基本使用方法。我的计算机环境是win7 64位系统,VS2010,matlab R2010b。一、工程配置:1.VC++目录->包含目录 添加:MATLAB\R2010b\extern\includeMATLAB\R2010b\extern\include\win64->库目录 添加:MATLAB\R201...

weixin_33773734的博客 1156

C++读写txt文件方式以及基于opencv的Mat数据类型读写txt文件

C++读写txt文件方式以及基于opencv的Mat数据类型读写txt文件

jacke121的专栏 3815

使用C++语言读取*.mat文件中的数据

借助于Matlab的接口函数,在Visual Studio中使用C++语言读取*.mat文件中的数据(这里主要是2维矩阵(灰度图像)和3维矩阵(彩色图像))到OpenCV中的Mat数据结构中并显示图像,同时实现将灰度图像转化为伪彩色图像(类型为Matlab中的colormap jet),最后调用Windows的API函数实现窗口尺寸的自由调整。

c++ matlab opencv,C++读写matlab的mat文件 结合opencv Mat结构测试

最近opencv工程有需要用到matlab的mat文件,遂研究整理如下:工程配置:1.包含目录:matlab安装目录\extern\include\win64 2.库目录:matlab安装目录\extern\lib\win64\microsoft 3.链接器->附加依赖项:libmat.lib libmx.lib libmex.lib libeng.lib(四个) 4.Path环境变量...

weixin_36433147的博客 512

HBM PHY 架构解析:从主控模块到DWORD设计的深度探索

本文深入解析了HBM PHY的完整架构,从作为系统大脑的PUB主控模块出发,详细阐述了其CSR控制、初始化与训练引擎的核心功能。进而剖析了负责命令传输的AWORDX2模块与作为数据高速公路的DWORD模块的设计奥秘,包括其双向数据流、精密时钟对齐与延迟线校准机制。最后,探讨了顶层MASTER PHY的整合作用及从DFI到DRAM的完整数据通路,为理解这一高性能内存接口的关键物理层设计提供了全面视角。

weixin_29306011的博客 290

Ubuntu 下用 C++ 读写.mat文件

该博客为《Ubuntu 相关》系列博客的第四篇,该系列博客主要对Ubuntu安装各种软件或者库进行一个纪记录,方便重装系统后快速恢复工作。 这是进项目组以来接受的第一个任务,以此记录实现过程。 此篇紧接上篇实现c++读取.mat文件。 Ubuntu 下用 C++ 读写.mat文件C++代码代码分解初始化应用程序.mat读取部分调用自己编译的MATLAB函数函数生成.mat文件 由于项目工程要求,需要使用matlab生成的.mat文件,于是查找了基本使用方法。 C++代码 该代码是这个项目的部分代码,包含了前

梁小憨憨的博客 2340

SecureCRT 9.0最新版安装与激活全攻略(附驱动识别技巧)

本文提供SecureCRT 9.0最新版的详细安装与激活指南,并重点解析了嵌入式开发中串口连接的硬件驱动识别技巧。内容涵盖从安全获取软件、解决USB转串口驱动兼容性问题,到配置SSH与串口会话的完整流程,旨在帮助开发者和工程师高效部署并精通使用这款终端仿真利器。

star的博客 407

二维码扫描与页面跳转的完整流程解析

本文详细解析了二维码扫描与页面跳转的完整流程,从核心原理到前后端实现,涵盖了二维码生成、扫码事件处理、后端验证机制及跳转逻辑等关键环节。特别介绍了如何使用qrcode.js生成二维码、WebSocket处理扫码状态以及JWT令牌验证设计,帮助开发者构建安全高效的扫码跳转系统。

cicd6pipeline的博客 1088

【C++、Matlab】VS2013 C++读写.mat文件

【fishing-pan:https://blog.csdn.net/u013921430转载请注明出处】前言 Matlab是一个非常强大的工具,为我们平时的学习和工作提供了非常大的便利。Matlab不仅自身功能强大,还为其他语言提供了接口,早前的学习中需要用的C++读写.mat文件,今天将当时的学习心得分享给大家,希望对大家有所帮助。软件工具:VS2013+Matlab2016a+Wi...

不用先生的博客 8468

centos 添加新硬盘,对根目录扩容

本地安装了虚拟机,系统为centos7,使用过程中,渐渐地发现磁盘容量不够用了,于是在虚拟机中新增了一块硬盘。 进入系统内查看: sdb是新增的硬盘,大小为40g。 接下来有两种方式,一种是普通方式直接挂载。https://blog.csdn.net/qq_39314099/article/details/106200322 这样的话只有在挂载点的目录下操作才能使用到这个新硬盘,不是很理想。 还有一种方式lvm,逻辑卷管理的方式。 LVM简单介绍: 它是 Linux 下对磁盘分区进行管

qq_39314099的博客 1万+

VS2010 C++读写.mat格式文件

运行环境:Win10(64位)+VS2010(64位)旗舰版+Matlab R2012b(64位)一.环境配置 1.计算机环境变量配置 在path中添加 X:\XXX\MATLAB\R2012b\extern\lib\win64\microsoft; X:\XXX\MATLAB\R2012b\extern\lib\win64 2.工程变量配置 右键工程名–>属性 (1).C/C++

木偶不哭不笑的博客 8949

运放实现阶梯波发生器-总结报告

实验目的: 学习、理解、掌握方波电路、限幅电路积分累加电路、反馈电路 课程条件: 电脑仿真软件Multisim 原理框图和实验思路: 方波电路通过微分电路可以形成正负脉冲,在通过限幅电路后变为单脉冲,最后在积分电路中形成阶梯波。微分电路存在的意义就是为了防止方波频率过大,从而导致在经过限幅电路的方波,在一个周期内将电容的电充满,这样就不会产生阶梯波。如果方波的频率比较小,可以近似认为是正负脉冲,这样就可以跳过微分电路。 ...............

0 1万+

uniapp [全端兼容] - 实现全景图Vr 720°全景效果查看预览功能,3D全景图流畅不卡顿渲染+手势拖拽+悬浮工具按钮,uniAPP实现vr看720度全景效果示例代码(H5小程序APP全兼容)

uniapp显示720度全景图,720°全景图显示,在h5中展示720°全景图,浏览全景图,基于uniApp实现vr全景预览,加载全景图,uni-app全景预览插件,UNI-APP实现3D全景图,实现720°全景图展示,uniapp全景视频播放,uniapp项目实现vr720度全景图片预览,在网页上展示760全景图片和视频,全景图场景切换,UNIAPP全景VR图,uniapp加载720全景图_uniapp怎么加载vr图片,uniapp实现vr全景看房,uni-app实现全景效果,加载很慢卡怎么办,实现全景预

🏆 前端领域优质创作者 1万+
上一篇: 三种快速排序算法的实现(递归算法、非递归算法、三路划分快速排序)
下一篇: 扫除算法(sweep)求逆矩阵
jimye
博客等级 码龄17年 260粉丝 32原创
评论 49
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值