第4讲Matlab的数据处理
司守奎
烟台市,海军航空工程学院数学教研室
Email:sishoukui@163
Matlab数据类型有以下几种:数值类型,字符串,日期和时间,结构数组,细胞数组(元胞数组),函数句柄,Java对象,逻辑类型等.
数值类型包括双精度浮点型,单精度浮点型,整型类型. 下面我们简单介绍细胞数组与结构数组,并主要给出数值类型数据的操作.
4.1 细胞数组与结构数组
4.1.1 细胞数组
细胞数组是Matlab中的一类特殊的数组. 在Matlab中,由于有细胞数组这个数据类型,才能把不同类型、不同维数的数据组成为一个数组.
1.细胞数组的创建
细胞数组的创建有两种方法:通过赋值语句或cell函数创建.
(1)使用赋值语句创建细胞数组:细胞数组使用花括号“{}”来创建,使用逗号“,”或空格分隔同一行的单元,使用分号“;”来分行.
(2)使用cell函数创建空细胞数组.
例4.1 创建细胞数组.
clc, clear %以下构造4个细胞数组
A={'x', [2;3;6]; 10, 2*pi}
B=cell(2,2)
C={{'LiMing','LiHong'},{'0101','0102'}; {'f','m'},{[90,80],[88,80]}}
fprintf('显示C{2,2}{1}的元素:'), C{2,2}{1}
fprintf('显示C{2,2}{2}的元素:'), C{2,2}{2}
fprintf('显示细胞数组C{2,2}所有元素(两个元素)的值:'), C{2,2}{:}
fprintf('以下显示细胞数组C的全部元素:\n')
celldisp(C)
fprintf('细胞数组C的全部元素显示完毕!\n')
D={A{:},B{:}} %把A和B合并成一个细胞数组
2.细胞数组的操作
Matlab提供的与细胞数组有关函数如表4-1所示.
表4-1 细胞数组的有关函数
例4.2 细胞数组操作示例.
clc, clear
a={1, [2 3 4]; [5;9], [6 7 8; 10 11 12]} %建立细胞数组
b=cell2mat(a) %将细胞数组合并成矩阵,注意维数必须匹配,否则出错,见下面的转换
c={1,rand(2,3);rand(3),rand(4)}
try, d=cell2mat(c), catch, fprintf('维数不匹配,无法转换!'),end
e=randi([1,9],4,5) %生成取值为{1,2,…,9}的4×5随机整数矩阵
f1=mat2cell(e,[2,2],[3,2]) %将e拆分成2×2的细胞数组
f2={e} %将e转换成1个元素的细胞数组
subplot(121), cellplot(f1) %显示f1结构图
subplot(122), cellplot(f2) %显示f2结构图
例4.3已知11个地点的位置坐标如表4-2所示,画出这11个点的位置并进行标注.
表4-2 地点名称及坐标数据
把表4-2中的数据保存在Excel文件eq_data3_3.xls中,执行如下命令
[a,b]=xlsread(eq_data3_3.xls)
则返回值a读入的是数值矩阵,b读入的字符串的细胞数组,但a,b中有些特殊数据要额外进行处理.
clc, clear
[a,b]=xlsread('data3_3.xls')
a=[a(:,[1,2]);a([1:end-1],[4,5])]; %提取需要的数据
b={b{:,1},b{[1:end-1],4}} %提取非空字符串,构造新的字符串细胞数组
plot(a([1:3],1),a([1:3],2),'P') %画前3个点
hold on, plot(a([4:end],1),a([4:end],2),'*') %画其余点
text(a(:,1)+5,a(:,2),b) %对所有的点进行标注
画出的11个地点的示意图见图4-1.
图4-1 位置示意图
说明:Matlab中网络图的顶点字符串等,都要求是细胞数组字符串.
4.1.2 结构数组
有时需要将不同的数据类型组合成一个整体,以便于引用. 这些组合在一个整体中的数据是相互联系的. 例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项都是和该学生有联系的.
Matlab与其它高级语言一样具有结构类型的数据. 结构类型是包含一组彼此相关、数据结构相同但类型不同的数据类型. 结构类型的变量可以是任意一种Matlab数据类型的变量,也可以是一维的、二维的或
者多维的. 但是,在访问结构类型数据的元素时,需要使用下标配合域名的形式.
1.结构数组的建立
Matlab提供两种方法建立结构数组,用户可以直接给结构数组成员变量赋值建立结构数组,也可以利用函数struct建立结构数组.
例4.4利用赋值建立结构数组.
clc, clear
stu(1).name='LiMing'; stu(1).number='0101';
stu(1).sex='f'; stu(1).score=[90,80];
stu(2).name='LiHong'; stu(2).number='0102';
stu(2).sex='m'; stu(2).score=[88,80];
stu %显示结构数组的结构
stu(1) %显示结构数组第1个元素
stu(2) %显示结构数组第2个元素
例4.5利用函数struct建立结构数组,并对两个结构数组进行连接.
clc, clear
stu=struct('name',{'LiMing','LiHong'},'number',{'0101','0102'},...
'sex',{'f','m'},'score',{[90,80],[88,80]})
stu2=[stu,stu] %对两个结构数组进行连接
name1=stu2(4).name %提取结构数组stu2的第4个元素的name域的值
name2={stu2.name} %提取结构数组stu2的name域的所有取值,构成细胞数组2.结构数组的操作
Matlab提供的与结构数组有关函数如表4-3所示.
表4-3 结构数组的有关函数
例4.6结构数组的操作.
clc, clear
stu=struct('name',{'LiMing','LiHong'},'number',{'0101','0102'},...
'sex',{'f','m'},'score',{[90,80],[88,80]})
a=fieldnames(stu) %获取stu所有域名
b1=getfield(stu,'number') %获取第1个元素的number域的值
b2=getfield(stu,{2},'number') %获取第2个元素的number域的值
c=isfield(stu,'sex') %判断sex是否为stu中的域
stunew=orderfields(stu) %按结构数组域名首字符重新排序
rmfield(stu,'sex') %删除sex域
例4.7结构数组和细胞数组的相互转化.
clc, clear
s_cell={'LiMing','0101','M',20;'ZhangSan','0102','F',30} %建立细胞数组
fields={'name','number','sex','age'} %建立细胞数组
s_struct=cell2struct(s_cell,fields,2) %沿第2维方向,将细胞数组转换成结构数组t_struct=struct('name',{'LiMing','LiHong'},'number',{'0101','0102'},...
'sex',{'f','m'},'age',{20,19}) %构造结构数组
t_cell=struct2cell(t_struct) %将4个域的结构数组转换成4×1×2的细胞数组
Matlab命令
f=dir('*.m')
可以显示当前目录下所有后缀名为m的文件信息,返回值f是一个结构数组,包
括5个域:name,date,bytes,isdir,datenum;通过结构数组的元素个数就可以
知道当前目录下m文件的个数,通过name域可以知道当前目录下所有m文件的
名称.
matlab二进制字符串转数组dir命令可以读出所有类型文件的信息.
例4.8读入当前目录下所有的后缀名为bmp的图片文件,并把数据保存在细
胞数组中.
clc, clear
f=dir('*.bmp'); %读入当前目录下所有bmp图像文件的信息,保存在结构数组f中n=length(f) %计算bmp文件的个数
for i=1:n
a{i}=imread(f(i).name);%把第i个bmp图像数据保存在细胞数组中的第i个元素中end
一些Matlab函数的返回值也是结构数组. Matlab求微分方程数值解的命令

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。