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

news/2024/11/28 7:46:08/

一、安装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.ppmy.cn/news/1324171.html

相关文章

无法解析服务器的名称或地址/Wsl/0x80072eff/win10 WSL2问题解决Wsl 0x800701bc/Wsl:0x80041002

无法解析服务器的名称或地址 和 Wsl/0x80072eff 1.连VPN&#xff0c;推荐的VPN如下。(如一直显示无法连接&#xff0c;则推荐使用VPN) Anycast加速器 (any4ga.com) 优点&#xff1a;无限GB 缺点&#xff1a;较贵&#xff0c;通过银行卡充值9折后的价格是每月45元左右 …

C++笔试题(一)

1. 已知int array[10] {1,2,3}&#xff0c;仅将数组名作为实参传递给函数&#xff0c;下列说法正确的是(D ) A. 数组会退化为指针 B. 实际传递给形参的是数组的第一个元素值 首地址 C. 实际传递给形参的是数组中全部元素的值 首地址 D. 可以在函数中获得数组元素的个数 2、下…

Spring MVC学习之——RequestMapping注解

RequestMapping注解 作用 用于建立请求URL和处理请求方法之间的对应关系。 属性 value&#xff1a;指定请求的实际地址&#xff0c;可以是一个字符串或者一个字符串列表。 value可以不写&#xff0c;直接在括号中写&#xff0c;默认就是value值 RequestMapping(value“/hel…

Dubbo分层设计之Serialize层

前言 Dubbo 框架采用 微内核 插件 的基本设计原则&#xff0c;自身功能几乎也都通过 SPI 扩展点实现&#xff0c;可以方便地被用户自由扩展和更换。 Dubbo 框架采用分层设计&#xff0c;自上而下共分为十层&#xff0c;各层均为单向依赖&#xff0c;每一层都可以剥离上层被复…

css3 纯代码案例

css3 纯代码案例 前言渐变之美1.1 纯CSS3实现的渐变背景1.2 使用多重颜色和方向打造丰富渐变效果1.3 渐变色停留动画的巧妙运用 纯CSS图形绘制2.1 使用border属性制作三角形、梯形等形状伪类箭头图标2.2 利用transform创建旋转、缩放的图形 浮动的阴影敲代码css准备reset 样式复…

LaWGPT安装和使用教程的复现版本【细节满满】

文章目录 前言一、下载和部署1.1 下载1.2 环境安装1.3 模型推理 总结 前言 LaWGPT 是一系列基于中文法律知识的开源大语言模型。该系列模型在通用中文基座模型&#xff08;如 Chinese-LLaMA、ChatGLM等&#xff09;的基础上扩充法律领域专有词表、大规模中文法律语料预训练&am…

【JavaEE进阶】 图书管理系统开发日记——壹

文章目录 &#x1f332;序言&#x1f334;前端代码的引入&#x1f38b;约定前后端交互接口&#x1f343;后端服务器代码实现&#x1f6a9;UserController.java&#x1f6a9;BookController.java ⭕总结 &#x1f332;序言 该图书管理系统&#xff0c;博主将一步一步进行实现。…

Microsoft Word 删除空行

Microsoft Word 删除空行 1. 删除空行1.1. 替换1.2. 段落标记 References 1. 删除空行 1.1. 替换 1.2. 段落标记 特殊格式 -> 段落标记 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/