今天起开始总结下MATLAB的文件操作函数。MATLAB的确用起来很方便,前提是你了解它的函数~

MATLAB的帮助文档看的那叫一个似懂非懂啊,特此总结。对我而言, fread的主要调用形式是这样的:

data = fread(fid, N, 'str')

fid不用说,自然是文件句柄(如fid=fopen('abc.txt' ,'r')),N是读入的元素个数,'str'是格式。在以前不会用的时候,格式都是直接省略的,这个时候函数就一个字节一个字节地从文件中读入数据,再在MATLAB中转化为double形式。

如果文件时二进制文件,这样读当然没问题,如果想要读入的是文本,那就不行了。文本也是一个字节一个字节地读,但是最后应该转化为char型:

>> frewind(f);

>> a=fread(f,1,'char=>char')

a =

B

>> frewind(f);

>> a=fread(f,1,'uchar=>uchar')

a =

66

>> class(a)

ans =

uint8>> frewind(f);

>> a=fread(f,1,'uint8=>char')

a =

B

>> frewind(f);

>> a=fread(f,1,'uchar=>char')

a =

B

>> frewind(f);

>> a=fread(f,1,'int8=>char')

a =

B

上面是一个BMP文件的例子,读入的是文件第第一个字节,BMP文件以“BM”开头,第一个自己自然是B。int8、uint8、char、uchar是几种一个字节的数据类型。在例子中,a=>b表示以a的类型读入,再转化为b类型。a的作用是控制每次读入的字节数,然后转化为相应的类型,形成一定的数值,b的作用是在a的基础上进行转化。这里都是一个字节,读入以后,最后如果是char型,就都变成了字母B,如果是uchar型,就变成uint8。

以上是字节数相同的例子,a=>b,a似乎没多大用,但是,当字节数不同时,就大有用场了:

>> frewind(f);

>> a=fread(f,1,'uint16=>uint8')

a =

255

% 在这里,uint16是两个字节的,所以一次性读入2个字节,先以uint16的形式读入,整数的排列规则是很简单的,假设低字节为a,高字节为b,那就等于b*256+a,得到的数肯定超过256,最后又要转化为uint8,因此只能截断了,uint8一个字节,最大能表示的数就是255,因此返回255.

>> frewind(f);

>> a=fread(f,1,'uint16=>float')

a =

19778

% 这里,说明以uint16读入的数,得到为19778,然后再转为单精度的float型,还是19778,当然,类型已经换掉了

>> frewind(f);

>> a=fread(f,1,'*uint32')

a =

37637442

% *uint32相当于uint32=>uint32,以4个字节的形式读入,成为一个整数。

>> frewind(f);

>> a=fread(f,1,'uint32=>float')

a =

37637440

% 以四个字节的形式读入,先变成整型,再变成float型,末尾的2丢掉了,是精度问题?

>> class(a)

ans =

single

>> frewind(f);

>> a=fread(f,1,'uint32=>double')

a =

37637442

% 转化为double,精度就够了

>> frewind(f);

>> a=fread(f,1,'float=>double')

a =

1.3981e-037

% 最精彩的来了,尽管float和uint32都是4个字节,但是这里得到的数却不与上面相等。前面说了,a=>b,系统以a的格式,读入相应的字节数,转化为a类型的一个数值,再将a转为b类型,这里读入的时候,以float的规则来读,再将float转为double,无非是提高精度而已。

>> frewind(f);

>> a=fread(f,1,'float=>uint32')

a =

0

% 读到的是1.3981e-037,转化为整数,当然是0了

此外,我还尝试过以下格式:

>> a=fread(f,1,'3*int8=>char')

a =

B

N*a=>b的形式,一般用在有skip(跳过)的地方,这里没有在后面的参数中指定跳过,所以默认的跳过为零,得到的结果还是字母B。跳过形式往往用在按bit读的时候,

>> a=fread(f,3,'*uint8')

a =

66

77

62

>> frewind(f);

>> a=fread(f,4,'1*int8=>int8',1)

a =

66

62

2

0

% 注意,前面读入的时候按int8读,所以跳过的时候,跳的是1个int8的长度,因此跳过了77,结果为66,,62

>> frewind(f);

>> a=fread(f,2,'1*bit8=>int8',8)

a =

66

62

% 前面是bit8,凡是bitN的类型的,后面跳过时都指的是跳过几个bit

>> frewind(f);

>> a=fread(f,2,'1*bit16=>int8',8)

a =

127

2

%前面读入是按两个字节读(bit16),因此第一次读进来的是66和77,后来要转为int型,int表示的范围-128~127,因此就变成127了。然后跳过了62,下一个数字是2,在下一个数字是0,因此加在一起就是0了。

另外,最全的调用形式是

[data, n] = fread(fid, N, 'a=>b', nn, 'l/n/b/...')

最后一个参数的作用是指定大端小端,windows这种用intel的是小端,低地址放低字节,所以读进66和77,66在低地址,他是低字节,77是高地址,是高字节,结果为66+77*256,UINX之类的一般是大端。网络通信一般是大端

'b'   :大端

'l'    :小端

'n'   :原来是大端现在就是大端,原来小端现在就是小端!

返回的n是指实际读进了几个单元。把n和N一比较,相等就说明确实读进了所需要的N个数据。

测试用的文件:

MATLAB fread读整数,MATLAB fread函数分析 | 学步园相关推荐

  1. matlab与c/c++混合...,matlab与c/c++ 混合编程之 MCR | 学步园

    什么是MCR? MCR之前是 matlab component runtime的缩写,后更名为 matlab compiler runtime.MCR实际上是一组独立的共享库,也即是常说的动态连接库, ...

  2. matlab 积分函数曲线,Matlab之函数积分 | 学步园

    Matlab之函数积分 一元函数(一重)积分: 求一元函数积分有quad函数,quadl函数,int函数: quad和quadl: quad和quadl两个函数,他们使用不同的 例:求 的积分: f= ...

  3. matlab中fval函数,收集整理Matlab中的linprog函数使用说明 | 学步园

    linprog函数是用来求解线性规划问题,其中,f,x,b,beq,lb,ub为向量,A,Aeq为矩阵. a).x=linprog(f,A,b) 功能:求解最小化问题:min f*x,条件:A*x≤ ...

  4. matlab 就近保留整数,matlab里面如何保留小数特定位,取整数及四舍五入

    matlab专区--------------matlab里 面如何保留小数特定位数 a=1.23456789 b=vpa(a,7) b = 1.234568 vpa(a,12) ans = 1.234 ...

  5. matlab频域积分,matlab数值积分实现(时域频域积分) | 学步园

    最近做有关加速度的数据处理,需要把加速度积分成位移,网上找了找相关资料,发现做这个并不多,把最近做的总结一下吧! 积分操作主要有两种方法:时域积分和频域积分,积分中常见的问题就是会产生二次趋势.关于积 ...

  6. matlab正弦函数fft,正弦函数及其FFT变换(一) | 学步园

    在MATLAB中想要画一个sin函数是很容易的,比如:首先定义t = 0:0.01:10,然后画出y = sin(2*pi*t)就可以了,最多再加相角啊之类的参数,但如果在C语言中应该如何自己制造一个 ...

  7. matlab输出高质量图片,Matlab 画平滑轮廓 print 高质量 figure | 学步园

    Matlab 画平滑轮廓 print 高质量 figure 在matlab中,想将分割的结果以轮廓的形式显示到灰度图上,要提取.绘制平滑轮廓. 自己提取轮廓.绘制,不方便,效果差. matlab提供了 ...

  8. matlab设l创建网络,利用matlab进行简单的贝叶斯网络构建 | 学步园

    matlab的安装 第一次装matlab,装好后发现没有在桌面生成图标,还以为是最后提示的编译器没有安装.结果发现,matlab的图标在其安装的bin目录下面,进行初始化就能开始使用了 关于贝叶斯网络 ...

  9. matlab 摄氏度符号怎么打,MATLAB中如何打角标和希腊字母 | 学步园

    声明:这是转载 很多时候都要在matlab画图的时候添加一些公式符号之类的,有一些特殊的字符并不能直接从键盘上输入,比如希腊字母等等.但是有想用,因为这样使图看起来漂亮而且容易理解. 例如:我想输入摄 ...

最新文章

  1. docker build命令详解_Docker 搭建你的第一个 Node 项目到服务器
  2. spring 整合websoket(整理)
  3. C++函数指针与回调函数
  4. SpringBoot笔记:SpringBoot2.3读取应用配置参数的几种方式
  5. 关于谨防诈骗的温馨提示
  6. Love2D游戏引擎制作贪吃蛇游戏
  7. [开源] .Net 使用 ORM 访问 神舟通用数据库(神通)
  8. 看到这块Google的“墓地”,心中作何感想?| 今日最佳
  9. Mockito和Hamcrest的试驾制造商
  10. 04_传智播客iOS视频教程_类是以Class对象存储在代码段
  11. oracle客户端和ssh区别,oracle 使用SSH 转发功能
  12. OpenShift 4 之Knative(1) - 创建Knative无服务器架构环境
  13. 写项目经历的注意事项
  14. 没有第三个变量的前提下交换两个变量_很多人连Python变量都没搞懂,说自己会python
  15. 切片器可以设置日期格式?_Power BI之相对日期的设置
  16. 深度学习之经典卷积神经网络的技术浅析 | 硬创公开课预告
  17. eq值 推荐算法_EQ,IQ,EIQ分析
  18. Promise的resolve方法和reject方法
  19. UVA - 1427 Paradev单调队列
  20. 【PMP】关键路径法

热门文章

  1. 守护S级产品锻造之路,WeTest领航跃迁,与时代同行
  2. Activity跳转到Fragment
  3. 基于bat+jad.exe实现jar包批量反编译
  4. 2023武汉科技大学计算机考研信息汇总
  5. Ubuntu16.04 LTS完整安装教程
  6. response对象的作用
  7. 用html语言编写表格,HTML表格(table标签)
  8. 抖音四面被拒,再战头条终获offer,面试真题解析
  9. 【poi第五节】poi设置Excel单元格边框 和 背景色,java设置Excel 单元格边框 和 背景色
  10. VR全景展示--探索无限可能