014_files_in_MATLAB中的文件读写

MATLAB中的文件读写

这一篇就要简单介绍MATLAB中的典型文件类型和文件操作。

基于字节流的接口

Matlab本身提供的文件操作是比较接近底层的,这一套底层的文件原语,主要是fopenfclosefreadfwritefseekftellfeofferror等函数。这些函数的使用方法和C语言中的文件操作函数类似,具体的用法可以参考MATLAB的官方文档。

字节流

操作系统的文件操作,一般区分二进制和文本文件,在Matlab中,采取是数组的形式进行读写,所以在Matlab中,可以设定非常灵活的读写方式。

当需要读入文件时,根据表达文件的字符的不同,可以在调用fread时,直接制定数组元素的数据类型,比如charint8int16int32int64uint8uint16uint32uint64singledouble等。这样就可以直接读取文件的内容。

当然,这里还会涉及到文件编码的问题,在这个入门的教程中,就不展开讨论了。

help fopen
 fopen - 打开文件或获得有关打开文件的信息此 MATLAB 函数 打开文件 filename 以便以二进制读取形式进行访问,并返回等于或大于 3的整数文件标识符。MATLAB 保留文件标识符 0、1 和 2 分别用于标准输入、标准输出(屏幕)和标准错误。语法fileID = fopen(filename)fileID = fopen(filename,permission)fileID = fopen(filename,permission,machinefmt,encodingIn)[fileID,errmsg] = fopen(___)fIDs = fopen('all')filename = fopen(fileID)[filename,permission,machinefmt,encodingOut] = fopen(fileID)输入参数filename - 要打开的文件的名称字符向量或字符串标量permission - 文件访问类型'r' (默认值) | 'w' | 'a' | 'r+' | 'w+' | 'a+' | 'A' | 'W'machinefmt - 读取或写入字节或位的顺序'n' (默认值) | 'b' | 'l' | 's' | 'a'encodingIn - 字符编码'UTF-8' | 'ISO-8859-1' | 'windows-1251' | 'windows-1252'fileID - 已打开文件的文件标识符整数另请参阅 fclose, ferror, fseek, ftell, feof, fscanf, fprintf, fread,fwrite, frewind已在 R2006a 之前的 MATLAB 中引入fopen 的文档doc fopenfopen 的其他用法i2c/fopen    icinterface/fopen    instrument/fopen    serial/fopen
help fwrite
 fwrite - 将数据写入二进制文件此 MATLAB 函数 将数组 A 的元素按列顺序以 8 位无符号整数的形式写入一个二进制文件。该二进制文件由文件标识符 fileID 指示。使用 fopen 可打开文件并获取 fileID 值。完成写入后,请调用 fclose(fileID) 来关闭文件。语法fwrite(fileID,A)fwrite(fileID,A,precision)fwrite(fileID,A,precision,skip)fwrite(fileID,A,precision,skip,machinefmt)count = fwrite(___)输入参数fileID - 文件标识符整数 | 1 | 2A - 要写入的数据数值数组 | 字符数组 | 字符串数组precision - 要写入的值的类和大小'uint8' (默认值) | 字符向量 | 字符串标量skip - 要跳过的字节数0 (默认值) | 标量machinefmt - 字节写入顺序'n' (默认值) | 'b' | 'l' | 's' | 'a'示例openExample('matlab/WriteUint8DataToFileExample')openExample('matlab/Write4byteIntegersToFileExample')openExample('matlab/AppendDataToBinaryFileExample')openExample('matlab/WriteBinaryFileWithBigendianByteOrderingExample')另请参阅 fclose, ferror, fopen, fprintf, fread, fscanf, fseek, ftell已在 R2006a 之前的 MATLAB 中引入fwrite 的文档doc fwritefwrite 的其他用法i2c/fwrite            instrument/fwrite    serial/fwriteicinterface/fwrite
help fread
 fread - 读取二进制文件中的数据此 MATLAB 函数 将打开的二进制文件中的数据读取到列向量 A 中,并将文件指针定位在文件结尾标记处。该二进制文件由文件标识符 fileID 指示。使用 fopen 可打开文件并获取 fileID值。读取文件后,请调用 fclose(fileID) 来关闭文件。语法A = fread(fileID)A = fread(fileID,sizeA)A = fread(fileID,precision)A = fread(fileID,sizeA,precision)A = fread(___,skip)A = fread(___,machinefmt)[A,count] = fread(___)输入参数fileID - 文件标识符整数sizeA - 输出数组的维度Inf (默认值) | 整数 | 二元素行向量precision - 要读取的值的类和大小'uint8=>double' (默认值) | 字符向量或字符串标量skip - 要跳过的字节数0 (默认值) | 标量machinefmt - 读取字节的顺序'n' (默认值) | 'b' | 'l' | 's' | 'a'输出参数A - 文件数据列向量 | 矩阵count - 读取的字符数标量示例openExample('matlab/ReadEntireFileofuint8DataExample')openExample('matlab/ReadEntireFileofDoublePrecisionDataExample')openExample('matlab/ReadSelectedRowsorColumnsfromFileExample')openExample('matlab/ReadDigitsofBinaryCodedDecimalValuesExample')另请参阅 fclose, fgetl, fopen, fscanf, fprintf, fwrite, fseek, ftell已在 R2006a 之前的 MATLAB 中引入fread 的文档doc freadfread 的其他用法i2c/fread            instrument/fread    serial/fread    udp/freadicinterface/fread

读写示例

在Matlab中,向文件写入的都是数组(Matrix),前面已经说过,数组的元素类型也是数组的类型。那么这里可以写入和读取的数据类型就是Matlab中的数据类型。这也是这个比较接近底层的文件操作依然在Matlab中有用武之地的原因。

在下面的例子中,我们在文件中写入一个字符串,然后再读取出来。可以看到很有意思的是,我们把字符串作为一个char的数组写入文件中。在读出的时候,可以选择读取char的数组,也可以选择读取为uint8的数组,还能够不同的数据类型,根据数据类型的实际大小,读取为不同长度的数组。

下面的例子中,可以看到,字符charuint8为1字节,int为4字节,double为8字节。

根据这样的方式,如果我们仔细设定数据的类型和字节读写顺序,就能够实现非常灵活又高效的二进制文件。通常我们如果需要读写别的软件、硬件系统产生的字节流数据,都是采用这种方式。实际上Matlab中与硬件设备的接口(包括网络接口、RS232等),也是通过这种方式实现的。这些硬件的接口函数中,通常也会用类似打开文件的方式得到句柄,并利用这些句柄进行读写操作。

fid = fopen('data.txt','w');
data = 'Hello, the World!';
fwrite(fid, data, 'char');
fclose(fid);dispVector('data.txt', 'char', '%c ');
dispVector('data.txt', 'char', '%d ');dispVector('data.txt', 'uint8', '%c ');
dispVector('data.txt', 'uint8', '%d ');dispVector('data.txt', 'int', '%d ');
dispVector('data.txt', 'single', '%g ');
dispVector('data.txt', 'double', '%g ');function vecRead = readVector(filename, type)fid = fopen(filename, 'r');vecRead = fread(fid, type);fclose(fid);
endfunction dispVector(filename, type, formatSpec)v = readVector(filename, type);fprintf('[');fprintf(formatSpec, v);fprintf(']\n');
end
[H e l l o ,   t h e   W o r l d ! ]
[72 101 108 108 111 44 32 116 104 101 32 87 111 114 108 100 33 ]
[H e l l o ,   t h e   W o r l d ! ]
[72 101 108 108 111 44 32 116 104 101 32 87 111 114 108 100 33 ]
[1819043144 1948265583 1461740904 1684828783 ]
[1.14314e+27 5.0761e+31 1.76357e+14 1.74467e+22 ]
[2.31597e+251 5.62865e+175 ]

用文本表示数据

我们有几种读取这类文本数据的方式:

  1. 数组格式化读入
    1. fscanf函数,这个函数的使用方法和C语言中的fscanf函数类似,但是Matlab中的fscanf函数更加灵活,可以读取不同的数据类型,也可以读取不同的数据格式。
  2. 行为基础的读入
    1. fgetlfgets函数,这两个函数用来读取一行文本,fgetl删除换行符,fgets保留换行符。这两个函数返回的是一个字符串,通常可以通过str2num函数将字符串转换为数值。
    2. textread函数,这个函数是一个比较古老的函数,用来读取文本文件,在被textscan所替代。
    3. textscan函数,这个函数是一个比较新的函数,用来读取文本文件,可以指定不同的数据类型,也可以指定不同的数据格式。

数组格式化读写

fscanf函数的使用方法和C语言中的fscanf函数类似,但是Matlab中的fscanf函数更加灵活,可以读取不同的数据类型,也可以读取不同的数据格式。

这个函数跟fprintf函数是一对,fprintf函数用来写入数据,fscanf函数用来读取数据。

这两个函数与其C语言对应版本还是有挺大区别,Matlab中说到一个类型,实际上都是指某个类型的数组,所有这两个函数,都可以直接操作数组。

首先看这个例子:

a = magic(3);
disp(a);fid = fopen('data.txt','w');
fprintf(fid, '%d ', a);
fclose(fid);% show text file content
type data.txt% 默认的读入,得到一个列向量
fid = fopen('data.txt','r');
b = fscanf(fid, '%d');
fclose(fid);
disp(b);% 按照矩阵的形式读入,按照列先的方式转化为矩阵
fid = fopen('data.txt','r');
b = fscanf(fid, '%d', [3,3]);
fclose(fid);
disp(b);
     8     1     63     5     74     9     28 3 4 1 5 9 6 7 2 8341596728     13     54     9

注意,fprintf函数会将其中的formatSpec参数中的%s%d%f等格式符号替换为对应的数据,然后写入文件。当不设定sizeA参数时,fprintf函数会将整个数组写入文件。并且,写入的方式是按照列的方式写入的。此处的%d的这个空格,也是的输出的数据之间有空格。

在使用fscanf函数时,formatSpec参数中的%s%d%f等格式符号,会被替换为对应的数据,然后读取文件中的数据。当不设定sizeA参数时,fscanf函数会读取整个文件的数据。并且,读取的方式是按照列的方式读取的。这个例子中,fscanf函数读取的数据是一个列向量。当设定sizeA参数时,fscanf函数会读取指定大小的数据。这个例子中,fscanf函数读取的数据是一个3x3的矩阵。

这个例子中的type函数跟命令行中的type命令类似,用来显示文件的内容。

help fprintf
 fprintf - 将数据写入文本文件此 MATLAB 函数 按列顺序将 formatSpec 应用于数组 A1,...An 的所有元素,并将数据写入到一个文本文件。fprintf 使用在对 fopen 的调用中指定的编码方案。语法fprintf(fileID,formatSpec,A1,...,An)fprintf(formatSpec,A1,...,An)nbytes = fprintf(___)输入参数fileID - 文件标识符1 (默认值) | 2 | 标量formatSpec - 输出字段的格式格式化操作符A1,...,An - 数值数组或字符数组标量 | 向量 | 矩阵 | 多维数组输出参数nbytes - 字节数标量示例openExample('matlab/PrintLiteralTextandArrayValuesExample')openExample('matlab/PrintDoublePrecisionValuesasIntegersExample')openExample('matlab/GetNumberofBytesWrittentoFileExample')另请参阅 disp, fclose, ferror, fopen, fread, fscanf, fwrite, fseek,ftell, sprintf已在 R2006a 之前的 MATLAB 中引入fprintf 的文档doc fprintffprintf 的其他用法dlarray/fprintf     icinterface/fprintf    simulink/fprintfgpuArray/fprintf    serial/fprintf
help fscanf
 fscanf - 读取文本文件中的数据此 MATLAB 函数 将打开的文本文件中的数据读取到列向量 A 中,并根据 formatSpec 指定的格式解释文件中的值。fscanf 函数在整个文件中重新应用该格式,并将文件指针定位在文件结尾标记处。如果 fscanf 无法将 formatSpec 与数据相匹配,将只读取匹配的部分并停止处理。语法A = fscanf(fileID,formatSpec)A = fscanf(fileID,formatSpec,sizeA)[A,count] = fscanf(___)输入参数fileID - 文件标识符整数formatSpec - 数据字段的格式字符向量 | 字符串标量sizeA - 输出数组的维度Inf (默认值) | 整数 | 二元素行向量输出参数A - 文件数据列向量 | 矩阵 | 字符向量 | 字符数组count - 读取的字符数标量示例openExample('matlab/ReadFileContentsIntoColumnVectorExample')openExample('matlab/ReadFileContentsIntoArrayExample')另请参阅 fopen, fprintf, textscan, sscanf, fgetl, fgets, fread已在 R2006a 之前的 MATLAB 中引入fscanf 的文档doc fscanffscanf 的其他用法icinterface/fscanf    serial/fscanf    udp/fscanf

基于行的读写

fgetl/fgets针对的都是单行的数据,每次读入一行,这一行都被当做一个字符串处理。这种方式适合处理文本文件,比如配置文件、日志文件等。

通常会在读取一行之后,会自行做分割(split函数),再用str2num函数将字符串转换为数值。这个函数的使用方法和str2double函数类似,只是str2num函数可以处理更多的数据类型。

当然Matlab提供了更为强大的textscan函数,这个函数可以指定不同的数据类型,也可以指定不同的数据格式。之前(R2006a)我们使用的是textread函数。

这两个函数逐行解析文本文件,并根据指定的格式解析数据。

在实际的应用中,我们通常会使用更加特化的存储格式,这些方式通常会更加流行,并且在不同的软件系统中都得到了相应的支持。所以我们这里就不再赘述这几个有一定难度的函数,如果感兴趣可以通过doc函数查看这几个函数的帮助文档。

几种特殊的流行格式

实际上,在Matlab中,使用得最多的还是下面几种格式的文件:

  1. 二进制文件
    1. mat文件
    2. fig文件
    3. xls文件
  2. 文本文件
    1. csv文件

其他格式的文件,例如音频、视频、图像等,Matlab也有相应的函数支持,还有json、xml等格式的文本文件,也不在这个入门教程的范围内。

mat文件

mat文件是Matlab的专有文件格式,这个文件格式是一个二进制文件,可以保存Matlab的变量,包括数组、结构体、函数句柄等。这个文件格式是Matlab的专有格式。

Matlab提供了loadsave函数,可以读写这个文件格式。

这个文件格式的优点是内在支持,可用性较好、前向兼容性也处理得不错,读写效率也比较高。在计算中要保存中间结果,通常会采用这个格式。

fig文件

fig文件是Matlab的图形文件,这个文件格式是一个二进制文件,可以保存Matlab的图形,包括图形的数据、图形的设置、图形的样式等。这个文件格式是Matlab的专有格式。

Matlab提供了openfigsavefig函数,可以读写这个文件格式。

这个格式的文件读出的图像,支持用鼠标进行交互,可以进行编辑,也可以进行保存为其他格式的文件。还能够通过findobj函数找到图形中的对象,进行进一步的操作。

xls文件

xls文件是Excel的文件格式,这个文件格式是一个二进制文件,可以保存Excel的数据,包括表格、图表、宏等。这个文件格式是Excel的专有格式。

Matlab提供了xlsreadxlswrite函数,可以读写这个文件格式。

csv文件

csv文件是文本文件的一种,这个文件格式是一个文本文件,可以保存表格数据,每行数据用逗号分隔,每行数据用换行符分隔。

Matlab提供了csvreadcsvwrite函数,可以读写这个文件格式。

新的数据读写方式

在R2019b版本中,Matlab引入了新的数据读写方式,这个方式是基于readtablewritetable函数的。这个函数的优点是更加灵活,可以读写不同的数据类型,也可以读写不同的数据格式。

这两个函数的使用方法和textscan函数类似,但是更加灵活,可以读写不同的数据类型,也可以读写不同的数据格式。

此外,Matlab还引入了readmatrixwritematrix函数,这两个函数是readtablewritetable函数的简化版本,只能读写数值数据,但是更加高效。

总结

  1. Matlab中实现了一个接近底层的文件操作原语,主要是fopenfclosefreadfwritefseekftellfeofferror等函数。
  2. 这个文件操作原语也具备Matlab直接操作数组的特性,因此可以实现非常灵活又高效的二进制文件读写。
  3. 针对文本文件,Matlab提供了fscanffgetlfgetstextreadtextscan等函数,可以实现文本文件的读写。
  4. 针对流行的文件格式,Matlab提供了loadsaveopenfigsavefigxlsreadxlswritecsvreadcsvwrite等函数,可以实现这些文件格式的读写。
  5. 新的数据文件读写倾向于采用同一个接口来针对不同文件,例如readtablewritetable函数,readmatrixwritematrix函数。

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

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

相关文章

Github 2024-04-14 php开源项目日报Top9

根据Github Trendings的统计,今日(2024-04-14统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9TypeScript项目1Laravel: 以优雅语法简化Web开发 创建周期:4028 天开发语言:PHP协议类型:MIT LicenseStar数量:30824 个Fork数量:1…

《青少年成长管理2024》046 “成长目标:你是谁呀?”2/3

《青少年成长管理2024》046 “成长目标:你是谁呀?”2/3 七、机器智能?八、天赋没有对错(一)天赋的客观性(二)我笨我没错(三)我聪明只是我幸运(四)…

在Linux驱动中,如何确保中断上下文的正确保存和恢复?

大家好,今天给大家介绍在Linux驱动中,如何确保中断上下文的正确保存和恢复?,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 在Linux驱动中&am…

windows系统搭建OCR半自动标注工具PaddleOCR

深度学习 文章目录 深度学习前言一、环境搭建准备方式1:安装Anaconda搭建1. Anaconda下载地址: [点击](https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?CM&OD)2. 创建新的conda环境 方式2. 直接安装python 二、安装CPU版本1. 安装PaddlePaddle2、安装…

中国省级人口结构数据集(2002-2022年)

01、数据简介 人口结构数据不仅反映了地域特色,更是预测地区未来发展趋势的重要工具。在这些数据中,总抚养比、少年儿童抚养比和老年人口抚养比是三大核心指标。 少儿抚养比0-14周岁人口数/15-64周岁人口数 老年抚养比65周岁及以上人口数/15-64周岁人…

leetcode每日一题(1702. 修改后的最大二进制字符串)

题目描述 题解 这道题贪心的思想,我们只需要尽可能多的把0变成1,而且进行操作1才能使其变大。观察发现以下几点: 不论原字符串有多少个0,最后都会剩余1个0。 假设原字符串只有一个0,不能进行任何操作,显然…

一招将vscode自动补全的双引号改为单引号

打开设置,搜索quote,在结果的HTML选项下找到自动完成,设置默认引号类型即可。 vscode版本:1.88.1, vscode更新日期:2024-4-10

利用Java代码调用Lua脚本改造分布式锁

4.8 利用Java代码调用Lua脚本改造分布式锁 lua脚本本身并不需要大家花费太多时间去研究,只需要知道如何调用,大致是什么意思即可,所以在笔记中并不会详细的去解释这些lua表达式的含义。 我们的RedisTemplate中,可以利用execute方…

共轭梯度法 Conjugate Gradient Method (线性及非线性)

1. 线性共轭梯度法 共轭梯度法(英语:Conjugate gradient method),是求解系数矩阵为对称正定矩阵的线性方程组的数值解的方法。 共轭梯度法是一个迭代方法,它适用于 1. 求解线性方程组, 2. 共轭梯度法也可…

学习基于pytorch的VGG图像分类 day5

注:本系列博客在于汇总CSDN的精华帖,类似自用笔记,不做学习交流,方便以后的复习回顾,博文中的引用都注明出处,并点赞收藏原博主. 目录 VGG的数据集处理 1.数据的分类 2.对数据集的处理 VGG的分类标签设置 …

2款Notepad++平替工具(实用、跨平台的文本编辑器)

前言 今天大姚给大家分享2款Notepad平替工具,实用、跨平台(支持Window/MacOS/Linux操作系统平台)的文本编辑器。 NotepadNext NotepadNext是一个跨平台的 Notepad 的重新实现。开发是使用 QtCreator 和 Microsft Visual C (msvc) 编译器完…

python输入某年某月某日判断这一天是这一年的第几天

如何使用python实现输入某年某月某日判断这一天是这一年的第几天 from datetime import datetime #引入日期类 def is_leap_year(year):"""判断是否为闰年"""return (year % 4 0 and year % 100 ! 0) or (year % 400 0)# 根据年份和月份返回当…

深度解析 Spark(进阶):架构、集群运行机理与核心组件详解

关联阅读博客文章:深度解析SPARK的基本概念 引言: Apache Spark作为一种快速、通用、可扩展的大数据处理引擎,在大数据领域中备受关注和应用。本文将深入探讨Spark的集群运行原理、核心组件、工作原理以及分布式计算模型,带领读者…

test4141

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

ES6: set和map数据结构以及使用场景

ES6:set和map数据结构 一、Set 数据结构:二、使用场景:使用Set 进行去重三、Map 数据结构四、使用场景:使用Map进行树型数据懒加载刷新五、Set和Map的区别六、Map、Set的实际使用场景 Set 和 Map 是 ES6 中引入的两种新的数据结构&#xff0c…

JavaScript中的Blob、Buffer、ArrayBuffer和TypedArray详解

文章的更新路线:JavaScript基础知识-Vue2基础知识-Vue3基础知识-TypeScript基础知识-网络基础知识-浏览器基础知识-项目优化知识-项目实战经验-前端温习题(HTML基础知识和CSS基础知识已经更新完毕) 正文 摘要:本文详细介绍了JavaS…

Spring之IoC容器(持续更新版本...)

目录 IoC容器1. Bean概述1.1. Bean命名1.2. 实例化Bean 2. 依赖关系2.1. 依赖注入2.2. 自动装配 3. Bean的范围4. 定制Bean的特性4.1. 生命周期回调4.2. Lifecycle、SmartLifecycle 以及 LifecycleProcessor4.3. Aware接口 5. 容器拓展6. 容器启动过程7. 基于注解的容器配置7.1…

(UDP)其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

“System.Net.Sockets.SocketException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。这个异常表示端口已经被占用了,需要释放端口或者使用其他端口来建立连接。您可以…

vite+react+ts+scss 创建项目

npm create vitelatest输入项目名称选择react选择typescript swc WC 通过利用 Rust 编写的编译器,使用了更先进的优化技术,使得它在处理 TypeScript 代码时能够更快地进行转换和编译。特别是在大型项目中,SWC 相对于传统的 TypeScript 编译器…

springboot火车运输物资定额领用管理系统java

本系统设计的现状和趋势,从需求、结构、数据库等方面的设计到系统的实现,分别为管理员和库房部、财务部、用户、生产部的实现。论文的内容从系统的设计、描述、实现、分析、测试方面来表明开发的过程。本系统根据现实情况来选择一种可行的开发方案&#…