第2讲 Matlab的数据处理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Matlab 程序如下 fid = fopen('data5.txt'); fgetl(fid) %读第 1 行的表头 mydata=textscan(fid, '%s %f %f %f %f %f %f', 'CollectOutput', true) %读数据 fclose(fid);
表3 函 数 分 类 打开和关闭文件 Matlab 的文件操作命令 函数名 fopen fclose fread fwrite fscanf 格式 I/O fprintf fgetl fgets 读写字符串 sprintf sscanf feof 文件定位 fseek ftell frewind 打开文件 关闭文件 读二进制文件 写二进制文件 从文件中读格式数据 写格式数据 从文件中读行,不返回行结束符 从文件中读行,返回行结束符 把格式数据写入字符串 格式读入字符串 检验是否为文件结尾 设置文件定位器 获取文件定位器 返回到文件的开头 作 用
1
表1
结构数组的有关函数 作用 生成和转换为结构数组 查询结构数组的属性名 查询结构数组的属性值 设置结构数组的属性值 删除属性 检查是否为数组的属性 检查数组是否为结构型
函数名 struct fieldnames getfield setfield rmfield isfield isstruct
等等。
函数 celldisp 用来显示细胞数组的每个元素的值。 函数 cellplot 将画出细胞数组的每 个元素的结构图。 当给已经定义的细胞数组下标范围外的元素赋值时,Matlab 自动扩维,对于没有赋值 的元素,赋值为空矩阵。 2 文件
根据数据的组织形式,Matlab 中的文件可分为 ASCII 文件和二进制文件。ASCII 文件又称文本文件,它的每一个字节存放一个 ASCII 代码,代表一个字符。二进制文件 是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。 Matlab 中的关于文件方面的函数和 C 语言相似,见表 3。
读写二进制文件
2.1 文件的打开和关闭 对文件读写之前应该“打开”该文件,在使用结束之后应“关闭”该文件。 函数 fopen 用于打开文件,其调用格式为: fid=fopen(‘filename’,’permission’) fid 是文件标识符(file identifier ) ,fopen 指令执行成功后就会返回一个正的
Matlab 命令为 a=dlmread('data4.txt','','A1..B2')
% 这里‘’表示数据之间的分隔符是空格
例 7 混合数据的读入 纯文本文件 data5.txt 存放如下数据,读入其中的数据。 日期 2007/06/04 2007/06/05 2007/06/06 2007/06/07 2007/06/08 开盘 33.76 31.90 31.90 32.41 32.70 最高 33.99 33.00 32.86 34.00 32.70 最低 31.00 29.20 31.00 32.16 31.18 收盘 32.44 32.79 32.27 32.73 31.60 交易量 282444.00 329276.00 236677.00 255289.00 272817.00 交易额 921965312.00 1032631552.00 756290880.00 845447232.00 862057728.00
4
例5
纯文本文件 data3.txt 中存放如下格式的数据,把其中的数据读入 Matlab 中。 从产地到销地的单位运价表 B2 B3 B4 B5 B6 B7 B8 2 6 7 4 2 5 9 9 5 3 8 5 8 2 2 1 9 7 4 3 3 6 7 3 9 2 7 1 3 9 5 7 2 6 5 5 2 2 8 1 4 3 37 22 32 41 32 43 38
表2 函数名 celldisp cell cellplot num2cell deal cell2struct struct2cell iscell 细胞数组的有关函数 作用 显示细胞数组的内容 生成细胞数组 用图形方式显示细胞数组 把数值型转换为细胞型 输入和输出的匹配 把细胞数组转换为结构数组 把结构数组转换为细胞数组 检验数组是否为细胞型
i)细胞数组的生成 有两种方法可以生成细胞数组:用赋值语句直接生成;先用 cell 函数预分配数组,然 后再对每个元素赋值。 有两种方法可对元素赋值: 一种方法采用数组元素的下标赋值。 下面四句命令将建立一 个 2 2 的细胞数组。 A(1,1)={[1:5;6:10]}; A(1,2)={'Anne cat'}; A(2,1)={3+7i}; A(2,2)={0:pi/10:pi}; 在大括号中,逗号或者空格表示每行元素之间的分割,分号表示不同行之间的分割。 另一种方法则把细胞数组的下标用大括号括起来, 而所赋的值采用普通数组的形式。 例 如下面四句生成的细胞数组和上面所生成的完全一样。 A{1,1}=[1:5;6:10]; A{1,2}='Anne cat';
第2讲
Matlab 的数据处理
司守奎 烟台市,海军航空工程学院数学教研室 Email:sishoukui@163.com Matlab 数据类型有以下几种:数值类型,字符串,日期和时间,结构数组,细胞数组 (元胞数组) ,函数句柄, Java 对象,逻辑类型等。 数值类型包括双精度类型,单精度类型,整型类型。下面我们主要讲数值类型的数据 操作。 1 结构数组与细胞数组 1.1 结构数组 有时需要将不同的数据类型组合成一个整体, 以便于引用。 这些组合在一个整体中的数 据是相互联系的。例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项都是和 该学生有联系的。 下面简单介绍结构体的定义与引用。 i)结构数组的定义 定义结构数组可以采用两种方法:用赋值语句定义和用函数 struct 定义。 用赋值语句定义结构时,只要给出结构的属性赋值,Matlab 就会自动把该属性增加到 结构中,赋值时,结构名和属性名用“.”分开。例如,下面三条语句将定义一个 1 1 的结 构数组,结构名为 student,有三个属性:name、num、test。该结构数组只有一个元素, 在命令窗口中键入结构名 student,将显示该元素所有属性的属性值特性。 student.name='John Doe'; student.num=123456; student.test=[79 75 73;80 78 79;90 85 80]; 再键入以下三行可给该结构数组增加一个元素。 student(2).name='Ann Lane'; student(2).num=123422; student(2).test=[70 76 73;80 99 79;90 85 80;80 85 86]; 现在结构数组 student 的维数为1 2 。当结构数组的元素超过 1 个时,MATLAB 的显示 信息中,不再显示不同属性的值,而只显示数组名、属性名和维数大小。 函数 struct 也可用来定义结构数组,其调用格式为: 结构数组名=struct(‘属性 1’,属性值 1, ‘属性 2’,属性值 2,…) ii)结构数组属性值的修改、设置和获取 结构数组一旦形成, 就可取出数组中的某个元素并修改该元素的某个属性值。 以上面建 立的 student 数组为例,命令 str=student(2).name 可取出第二个元素的 name 属性的值。 命令 n=student(2).test(4,2) 取出第二个元素 test 的值中第四行第二列上的数。 同理,可用命令 student(2).test(4,2)=0 修改第二个元素 test 的值中第四行第二列上的数的值。 关于结构数组有表 1 中的函数。
3
fid 值,如果 fopen 指令执行失败,fid 就返回-1。 filename 是文件名。 permission 是文件允许操作的类型,可设为以下几个值: ‘r’ 只读 ‘w’ 只写 ‘a’ 只能追加(append) ‘r+’ 可读可写 与 fopen 对应的指令为 fclose,它用于关闭文件,其指令格式为: status=fclose(fid) 如果成功关闭文件,status 返回的值就是 0。 2.2 读写操作 1)读操作 fread(‘filename’) 读二进制文件。 fscanf(‘filename’) 读纯文本文件。 2)写操作 fwrite 的指令格式 fwrite(fid,要保存的数据矩阵,’精度格式 ’) fprintf 的指令格式 fprintf(fid,’数据格式 ’,需要保存的数据矩阵) 3 Matlab 的 mat 文件 例 1 把 Matlab 工作空间中的数据矩阵 a, b, c 保存到数据文件 data1.mat 中。 save data1 a b c 注 :Matlab 中的默认数据文件 mat 文件可以省略后缀名。 例 2 把例 2 生成的 data1.mat 中的所有数据加载到 Matlab 工作空间中。 load data1 例 3 把矩阵 a,b 保存到数据文件 example.mat 中,然后重新加载到工作空间中,并计 算矩阵 a 的各列均值。 clc, clear a=rand(5); b=magic(4); save example.mat a b % 把 a,b 矩阵保存到 mat 文件中 clear %清理内存空间 c=matfile('example.mat') % 把 mat 文件加载到工作空间 d=size(c,'a') %读 a 矩阵的维数 am=mean(c.a) %计算 a 矩阵的每列均值 通过上面例子可以看出把 mat 文件加载到工作空间, 既可以使用命令 load,也可以使用 命令 matfile。 4 纯文本文件 4.1 读入纯文本文件 可以把 word 文档中整行整列的数据粘贴到纯文本文件, 然后调入到 Matlab 工作空间中。 例 4 把纯文本文件 data2.txt 加载到工作空间。 a=load('data2.txt'); 或者是 a=textread('data2.txt');
1.2
细胞数组 细胞数组也是 MATLAB 里的一类特殊的数组。 在 MATLAB 里, 由于有细胞数组这个数据类 型,才能把不同类型、不同维数的数组组成为一个数组。 细胞数组的每一个元素可为类型不同、维数不同的矩阵、向量、标量或多维数组,所有 元素用大括号括起来。如矩阵 A=[1 2 3 4;2 3 4 5;3 4 5 6] ,则命令 c={A,sum(A),sum(sum(A))} 得到一个 1 3 的细胞数组。 关于细胞数组有表 2 中的函数。
2
A{2,1}=3+7i; A{2,2}=0:pi/10:pi; 命令 B=cell(3,4) 创建一个 3 4 的细胞矩阵。 ii)细胞数组内容的查看 对于上面建立的数组 A,在 Matlab 命令窗口键入变量名 A,将显示数组的简要信息。用 大括号{ }括起来的下标为细胞数组的第几个元素,用圆括号()括起来的下标为大括号{ } 对应的某个元素的分量。如 A{2,2}(1),A{4}(1)
A1 A2 A3 A4 A5 A6 销量
B1 6 4 5 7 2 5 35
ቤተ መጻሕፍቲ ባይዱ
产量 60 55 51 43 41 52
Matlab 程序如下 a=importdata('data3.txt') %返回值 a 是结构数组 b=a.data %提出其中的数据 b(isnan(b))=0 %把其中的不确定值替换成 0 例 6 纯文本文件 data4.txt 存放如下数据, 读入其中的前两行前两列交叉位置的 4 个元 素。 6 4 5 7 2 5 2 9 2 6 3 5 6 5 1 7 9 2 7 3 9 3 5 2 4 8 7 9 7 8 2 5 4 2 2 1 5 8 3 7 6 4 9 2 3 1 5 3