Ubuntu平台上C语言利用matio库读取mat文件

一、安装matio库

matio库是一个用于读取和写入MAT文件(MATLAB数据格式)的开源C库。它提供了一组函数和工具,使得在C和C++程序中可以方便地读取和写入MAT文件中的数据。MAT文件是MATLAB软件中常用的文件格式,用于存储多维数值数组、结构体、字符数据等。

在ubuntu20.04系统中,可以直接使用命令行apt工具获取matio库。依次执行以下步骤即可:

1、更新系统包列表

sudo apt update

2、安装matio库

sudo apt install libmatio-dev

3、验证安装

pkg-config --modversion matio

二、利用gcc编译

如需要使用使用matio库,需要对gcc命令添加额外的参数。

1、正常情况下,编译名为test.c的C语言源码文件需要命令行输入:

gcc test.c

这样,在test.c相同文件夹下,生成默认的可执行文件a.out。在相同文件夹下命令行执行

./a.out

即可运行程序。

2、如果需要指定可执行文件的名称,则需要如下操作

gcc test.c -o name

生成了名称为name的可执行文件。

./name

可以运行程序。

3、但是,如果应用了matio库,则需要对gcc命令添加额外的参数。由于Ubuntu中的C/C++库文件是被存放在/usr/lib或者/usr/lib/x86_64-linux-gnu中的(也可能是其他位置)。所以编译的时候需要手动链接外部库。指令如下:

gcc test.c /usr/lib/libmatio.a -o name

其中,libmatio.a即为matio库文件。

4、然而,为了省去搜索外部库位置的操作,可以直接用以下命令代替上述操作

gcc test.c -lmatio -o name

注意,-lmatio和手动输入库位置,是完全等价的。

三、C语言中如何使用matio库

1、包含matio库头文件:在你的代码中,使用#include指令包含matio库的头文件。例如,如果要读取MAT文件,可以在代码中添加以下行:

#include <matio.h>

2、打开MAT文件:在代码中使用Mat_Open()函数打开MAT文件。该函数返回一个指向mat_t类型结构体的指针,该结构体包含有关MAT文件的信息。例如,要打开名为example.mat的MAT文件,可以使用以下代码:

mat_t *matfp;
matfp = Mat_Open("example.mat", MAT_ACC_RDONLY);

请注意,MAT_ACC_RDONLY表示只读访问模式,如果需要写入数据到MAT文件,请使用MAT_ACC_RDWR访问模式。

3、读取变量:在MAT文件中,变量存储在结构体中。需要使用Mat_VarRead()函数读取结构体变量,该函数返回一个指向matvar_t类型结构体的指针。例如,要读取名为myvar的MAT变量,可以使用以下代码:

matvar_t *matvar;
matvar = Mat_VarRead(matfp, "myvar");

注意,Mat_VarRead函数的第二个参数需要指定MAT变量的名称,如果名称未知,可以使用Mat_ReadNext()函数

while ((matvar = Mat_VarReadNext(matfp)) != NULL) 
{// 在这里处理matvar,例如打印变量名称printf("变量名称:%s\n", matvar->name);// 释放matvar的内存Mat_VarFree(matvar);
}

注意,释放matvar的内存非常重要。由于matvar只是一个结构体指针,被重新赋值的时候,原来指向的内存空间不会被释放,这会造成内存泄漏!

4、释放资源:在完成读取任务后,需要释放打开的MAT文件和读取的变量。可以使用Mat_VarFree()函数释放变量,使用Mat_Close()函数关闭MAT文件。例如,可以使用以下代码来释放资源:

Mat_VarFree(matvar);
Mat_Close(matfp);

四、示例代码

#include <stdio.h>
#include <matio.h>static double** p_target_array=NULL;int main(void)
{mat_t* p_mat_info;p_mat_info=Mat_Open("Image_letter_E.mat",MAT_ACC_RDONLY);if (p_mat_info==NULL){printf("open failed!\n");return 1;}matvar_t* p_mat_var;p_mat_var=Mat_VarReadNext(p_mat_info);int rank;rank=(int)p_mat_var->rank;size_t* dims;dims=(size_t*)p_mat_var->dims;double* data=(double*)p_mat_var->data;p_target_array=(double**)calloc(dims[0],8);for(int i=0;i<dims[0];i++){p_target_array[i]=(double*)calloc(dims[1],8);for (int j=0;j<dims[1];j++){p_target_array[i][j]=data[i*dims[0]+j];}}Mat_VarFree(p_mat_var);Mat_Close(p_mat_info);printf("%f",p_target_array[0][0]);return 0;
}

matvar_t结构体有哪些成员变量,可以上网搜索。需要注意的是,像我这样读取一个double类型的矩阵,虽然矩阵是二维的。但matvar_t的成员变量其实还是一个一维的数组。需要手动展开为二维的数组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt 调试系统输出报警声以及添加资源

文章目录 前言一、方法1 使用 Qsound1.添加都文件 直接报错2.解决这个错误 添加 QT multimedia3. 加入代码又遇到新的错误小结 二、第二种方法1.引入库2.添加资源2.1依次点击Qt--->Qt Resource File--->Choose2.2给资源文件起个名字&#xff0c;如&#xff1a;res&#…

【每日一题】构造限制重复的字符串

文章目录 Tag题目来源解题思路方法一&#xff1a;贪心空间复杂度&#xff1a; O ( ∑ ) O(\sum) O(∑)。 写在最后 Tag 【贪心】【字符串】【2024-01-13】 题目来源 2182. 构造限制重复的字符串 解题思路 方法一&#xff1a;贪心 思路 解题思想比较简单&#xff0c;利用贪…

【MySQL】:掌握SQL中DDL的数据库定义与操作

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. SQL的分类二. DDL数据库操作2.1 查询所有数据库2.2 查询当前数据库2.3 创建数…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-8 状态观测器设计 Linear Observer Design

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-8 状态观测器设计 Linear Observer Design

虚幻引擎nDisplay教程:如何同步nDisplay节点与Switchboard + Helix Core

对于使用大型LED屏幕进行拍摄的虚拟制作团队来说&#xff0c;虚幻&#xff08;Unreal&#xff09;的nDisplay是一个重要的工具。但是&#xff0c;在nDisplay中将正确版本的文件发送到每个节点会非常耗时。立即阅读本文&#xff0c;您将了解到如何使用Perforce Helix Core版本控…

Linux 系统之部署 ZFile 在线网盘服务

一、ZFile 介绍 1&#xff09;ZFile 简介 官网&#xff1a;https://www.zfile.vip/ GitHub&#xff1a;https://github.com/zfile-dev/zfile ZFile 是一款基于 Java 的在线网盘程序&#xff0c;支持对接 S3、OneDrive、SharePoint、又拍云、本地存储、FTP 等存储源&#xff0…

【Go】excelize库实现excel导入导出封装(三),基于excel模板导出excel

前言 大家好&#xff0c;这里是符华~ 关于excelize库实现excel导入导出封装&#xff0c;我已经写了两篇了&#xff0c;我想要的功能基本已经实现了&#xff0c;现在还差一个模板导出&#xff0c;这篇文章就来讲讲如何实现用模板导出excel。 前两篇&#xff1a; 【Go】excel…

爬虫-5-数据提取-正则,xpath

#免责声明:本文仅供学习&#xff0c;请遵纪守法。 ԅ(ㅂԅ)

Leetcode 剑指 Offer II 061. 查找和最小的 K 对数字

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定两个以升序排列的整数数组 nums1 和 nums2 , 以及一个整数 k…

使用CloudCompare对obj网格模型转换为pcd/ply点云模型

1.打开CloudCompare&#xff0c;点击文件夹图标&#xff0c;首先先把文件类型选择为.obj&#xff0c;然后再去找预处理的obj网格模型&#xff0c;点击打开。 2.测试打开的obj网格模型如下图&#xff1a; 3.选中obj文件&#xff0c;点击网格上样本点的图标&#xff0c;输入预生成…

探索 C# 中的程序运行目录获取方法

探索 C# 中的程序运行目录获取方法 引言 在 C# 开发中&#xff0c;有时需要确定您的应用程序的运行目录。这可能是为了读取配置文件、存储日志&#xff0c;或者访问与应用程序位于同一目录的其他资源。C# 提供了几种方法来获取当前程序的运行目录。本文将探讨这些方法及其使用…

群晖Synology Drive同步文件时过滤指定文件夹“dist“, “node_modules“

群晖Synology Drive同步文件时过滤指定文件夹"dist", “node_modules” mac用户 安装Synology Drive创建同步任务修改Synology Drive配置 打开/Users/[用户名]/Library/Application Support/SynologyDrive/data/session/[同步任务序号&#xff0c;第一个同步任务就…

【Maven】003-基于 IDEA 创建 Maven 工程

【Maven】003-基于 IDEA 创建 Maven 工程 文章目录 【Maven】003-基于 IDEA 创建 Maven 工程一、关于 Maven 工程的 GAVP1、GAVP 简介2、GAV 坐标规范3、Packaging 定义规则 二、基于 IDEA 创建 Maven 工程1、创建 Maven 项目2、创建结果3、项目结构说明 一、关于 Maven 工程的…

Abaqus许可分析策略:为企业打造高效、稳健的许可管理体系

在当今复杂多变的市场环境中&#xff0c;制定一套高效、稳健的许可分析策略对于企业的长远发展至关重要。Abaqus许可分析策略凭借其独特优势和卓越性能&#xff0c;旨在帮助企业构建强大的许可管理体系&#xff0c;实现持续盈利和竞争优势。 一、Abaqus许可分析策略的核心优势…

Django(七)

Django(六) 4.编辑用户 点击编辑&#xff0c;跳转到编辑页面&#xff08;将编辑行的ID携带过去&#xff09;。编辑页面&#xff08;默认数据&#xff0c;根据ID获取并设置到页面中&#xff09;提交&#xff1a; 错误提示数据校验在数据库更新 user_edit.html {% exte…

Docker五部曲之二:Docker引擎

文章目录 前言Docker引擎镜像管理容器管理容器运行前台运行和后台运行容器识别重启策略清除 容器日志 数据管理卷挂载创建和管理卷启动带有卷的容器通过Docker Compose使用卷使用只读卷备份、恢复和迁移卷 绑定挂载用绑定挂载启动一个容器Docker Compose使用绑定挂载使用只读绑…

【嵌入式——QT】QT静态编译

【嵌入式——QT】QT静态编译 QT下载查看文档下载Visual Studio打开命令行模式编译添加QT到Qt Creator编译示例 QT下载 下载地址 进入目录&#xff0c;我这里选择的qt-everywhere-src-5.14.1.zip。 查看文档 解压压缩包打开源码&#xff0c;查看README文件&#xff0c;里面…

双交叉限幅控制总结

空燃比小于等于1使用下图&#xff1a;空燃比大于1&#xff0c;MAX变MIN&#xff0c;MIN变MAX&#xff0c;高低选互换即可。加负荷&#xff0c;先加空气&#xff0c;后加煤气&#xff0c;降负荷&#xff0c;先降煤气&#xff0c;后降空气。 交叉限幅和双交叉限幅的区别 交叉限幅…

15. C++ memcpy和memmove

1. memcpy和memmove 函数原型&#xff1a; void *memcpy(void *dest, const void* src, size_t count ); void *memmove(void *dest, const void* src, size_t count );1.1 memcpy和memmove相同点 都是用于从src拷贝count个字节到dest。 1.2 memcpy和memmove区别 如果目标…