1.34 元胞数组
1.元胞数组的创建、索引和转换方法
2.认识函数
创建方法:a={}和cell (与Python中字典结构相似)
判断iscell
索引()和{}
转换cell2mat、mat2cell
3.概念
元胞数组(cell array)是一种具有容器特性的数据类型,每个元素可以包含任何类型的数据
4.说明
元胞数组创建和扩展时默认填充元素是空矩阵[]
元胞数组不需要完全连续的内存,但每个元素需要连续的内存
对大型的元胞数组,增加元素数量可能导致Out of Memory错误
因此,必要时,元胞数组需要初始化和预分配内存
5.实例演示
%1_34
%% 元胞数组创建、2种预分配内存方法
a={}
b={1,2,magic(3)
\’a\’,[\”a\”,\”b\”],[]} %分别双精度标量、3阶魔方矩阵、字符、字符串数组、空矩阵。2行用回车分割,或用分号分割
cell(2,3) %创建2行3列元胞数组
c=cell(100,100) %对大型元胞数组,预分配内存
d={} %初始化后(也可不初始化,因Matlab使用变量不需提前声明,因此也可直接赋值)
d{100,100}=[] %用数组扩展的方式,将第100行第100列元素设置为空,其他未指定元素默认用空矩阵填充,完成预分配内存
iscell(a) %判断元胞数组
%% 元胞数组索引方法(可类比字符串数组索引)
b(1,3) %索引元胞数组的元素
b{1,3} %索引元胞数组的元素的内容
b{1,1:3} %索引1行1-3列元素,未指定输出变量,默认ans
[v1,v2,v3]=b{1,1:3} %索引3个元素值,并赋值给3个变量
v=b{1,1:3} %当仅指定1个输出变量,则只返回第1个值
b{1,3}(1:2) %二级索引
%% 元胞数组数据连接
%[b{1,1:3}] %维度不同无法连接
[b{1,1:2}] %2个索引到的元素,连接为1*2矩阵
%% 元胞数组转换:每个元胞元素类型相同且大小相同才可转换
%cell2mat(b) %b没有明确结果类型因此报错
m=cell2mat({1 2}) %数值型可以转换为矩阵
n=cell2mat({\’a\’,\’b\’})
%cell2mat({\”a\”,\”b\”}) %该转换函数不支持字符串数组
mat2cell(m,1) %第2个参数1表示1行1列元胞数组,将整个矩阵看做元胞数组元素
mat2cell(m,1,[1 1]) %第3个参数指定了列数为2列,每列个数分别为1
mat2cell(n,1)
mat2cell(n,1,[1 1])
1.35 元胞数组的修改
1.元胞数组的修改、添加、删除和连接
2.认识函数
连接[]和{}
3.说明
元胞数组的子数组或元素也是元胞型的,其元素内容是本身类型
4.实例演示
%1_35
%% 元胞数组修改
b={1,2,magic(3)
\’a\’,[\”a\”,\”b\”],[]} %理解:元胞数组是大箱子,用大括号表示,内部的元素是盒子,盒子也是元胞型,盒子与箱子遵循Matlab预设规则,能修改的就是打开盒子往里面装内容,内容可以是任意大小任意格式的内容。
% b(1,1)=100 %元胞数组数据修改,小括号索引出第1行第1列元胞型,100双精度型无法赋值(小括号索引到盒子),报错
b(1,1)={100} %赋值也应包装成盒子(元胞型)再赋值
b{1,1}=100 %(大括号索引到盒子的内容)所以使用任意数值赋值即可
%% 元胞数组添加、删除
b(3,4)={8} %b本身是2行3列,如此扩展为3行4列,第3行第4列为{8}其余扩展元素默认空矩阵填充
% b(1,1)=[] %报错,删除1个元素无法保持矩阵矩形
b(end,:)=[] %最后一行删除,可行
b{1,1}=[] %大括号索引到盒子里的内容,并置为空(删除),盒子仍存在
%% 元胞数组连接
%中括号连接:把元胞数组打开重排
[{1 2 3},{\’a\’}] %水平连接
% [{1 2 3};{\’a\’}] %列数不同,报错
[{1 2 3};{\’a\’,[],[]}] %列数相同
%大括号连接:元胞数组视为整体重排(可理解为元胞数组的嵌套,元胞数组内可容纳任意类型,包括元胞型自身)
{{1 2 3},{\’a\’}} %水平连接
{{1 2 3};{\’a\’}} %纵向排列
{{1 2 3},{\’a\’},{},[],string(missing),uint16(10)} %只要占用元胞数组内的盒子,都会显示
1.36 结构数组
1.结构数组的创建、索引和预分配内存
2.认识函数
创建struct
判断isstruct
运算符 .
3.概念
结构(structure array)是一种具有容器特性的数据类型,它使用称为字段的数据容器对相关数据进行分组,每个字段可以包含任何类型或大小的数据。(与元胞数组描述类似,都是容器型数据类型,组织结构不同)
包含1个元素的结构数组
包含2个元素的结构数组
4.创建方法(2种方法)
数组名.字段名=字段值,遍历所有字段名赋值
数组名=struct(‘字段名’,‘字段值’…)
5.说明
所有元素都具有相同数量的字段和相同的字段名称
字段未指定的默认值为[](默认为空矩阵,与元胞数组相同)
结构数组不需要完全连续的内存,但每个字段需要连续的内存
对于大型的结构数组,增加字段的数量或字段中数据的数量可能会导致Out of Memory错误
因此,必要时,结构数组需要初始化和预分配内存
6.实例演示
%1_36
%% 单元素结构数组创建
%方法1:(分别列出字段信息,元素名与字段信息用圆点(.)分隔)
student.xingming=\’zhangsan\’; %student是结构数组名,后跟字段名,等号右侧为字段值
student.xuehao=\’00001\’;
student.chengji=[1 2 3;4 5 6]
%方法2:(struct函数创建,分别列出每条字段信息,最后赋值给变量名)
stu=struct(\’xingming\’,\’zhangsan\’,\’xuehao\’,\’00001\’,\’chengji\’,[1 2 3;4 5 6])
%单元素结构数组的操作
isstruct(stu) %判断结构数组
stu.chengji %字段索引
stu.chengji(1:3)%2级索引,与元胞数组类似
%% 多元素结构数组
%方法1:(在前面基础上添加)
student(2).xingming=\’lisi\’;
student(2).xuehao=\’00002\’;
student(2).chengji=[7 8 9;1 2 3]
%方法2:
stu(2)=struct(\’xingming\’,\’zhangsan\’,\’xuehao\’,\’00001\’,\’chengji\’,[1 2 3;4 5 6])
%多元素结构数组操作
student.chengji %若不指定哪个元素,则显示所有该字段名的值
student(2).chengji %指定第2个元素,显示该元素的该字段值
% student.chengji(1:3) %2个及以上元素的结构数组不能直接使用二级索引,因未指定元素,无法确定索引的结果
student(2).chengji(1:3)
%预分配内存
st(100,100)=struct(\’a\’,[]) %边界思想,设置结构数组的边界元素为字段名为\’a\’且字段值为[]的结构数组,其他元素值默认填充为空[]
st.a %索引st的字段\’a\’,返回100个空矩阵
1.37 结构数组的处理
1.结构数组的连接、嵌套、引用变量值和访问字段值
2.说明
结构数组必须具有相同的字段名才能连接,元素数目可以不同
为某元素添加字段,其他所有元素也具有了该字段,默认值为[]
3.实例演示
%1_37
%freexyn
%创建3个结构数组student/stu/st
student.xingming=\’zhangsan\’;
student.xuehao=\’00001\’;
student.chengji=[1 2 3;4 5 6];
stu=struct(\’xingming\’,\’zhangsan\’,\’xuehao\’,\’00001\’,\’chengji\’,[1 2 3;4 5 6]);
student(2).xingming=\’lisi\’;
student(2).xuehao=\’00002\’;
student(2).chengji=[7 8 9;1 2 3]
stu(2)=struct(\’xingming\’,\’zhangsan\’,\’xuehao\’,\’00001\’,\’chengji\’,[1 2 3;4 5 6])
st(100,100)=struct(\’a\’,[])
%% 结构数组的连接
[student,stu] %同为1*2结构数组,并且字段名相同,结果为1*4结构数组
% [student,st] %维度不同且字段名不同,报错
%% 嵌套
student(1).stu=stu %嵌套,理解:创建字段名stu,并把原结构数组stu作为字段值赋值给该字段名。给结构数组student的第1个元素student(1)添加stu字段,其他所有元素(如student(2))也会具有该字段
student(1).stu %索引,第1个元素的stu字段名里的字段值(字段内容),结果为原stu数组
student(2).stu %索引,结果是空矩阵,因为未指定该字段的值
%多级索引打开内部嵌套的字段值(理解:结构数组的索引,用圆点运算符(.)层层打开字段值,访问所需内容)
student(1).stu(1) % student第一个元素的stu字段的第一个元素的值
student(1).stu(1).chengji %进一步获取该元素的chengji字段的值
student(1).stu(1).chengji(1:3) %进一步获取成绩值的第1-3元素
%% 预留字段(添加新字段)
yuliuziduan=\’nianling\’ %通过预留变量名的形式,给元素添加字段,字段名的赋值需字符型。
stu(1).(yuliuziduan)=\’nan\’ %给包含多个元素的结构数组通过小括号+预留变量名的方式添加字段时,要指定具体元素,等号右侧赋字段值
%用途:当后面需要修改字段名时,不需再每处修改,而只修改预留变量所赋的值即可,树状图思想,预留变量作为中间值
stu(1).(yuliuziduan) %小括号引用该预留变量代表的字段名,并索引该字段名的字段值,即nan
%% 获取结构数组字段值
student.chengji %索引student所有元素的chengji字段的值
v=student.chengji %当只有一个输出参数v时,只返回第1个值
[v1,v2]=student.chengji %若返回所有字段值,则指定相同个数的输出参数
v=[student(1).chengji,student(2).chengji] %将多字段值存储在同一矩阵中,则先将字段值提取再矩阵连接。要求字段值数据类型相同,横纵连接符合矩阵连接的维度要求
1.38 表
1.表类型数据的创建、索引和自身属性的用法
3*3 table数组
2.认识函数
创建table
判断istable
属性.Properties
3.概念
表(table)具有容器特性的数据类型,可以方便的存储混合类型的数据,可以使用数字或命名索引访问数据以及元数据(例如变量名称,行名称,描述和变量单位等)
4.说明
表由行和列组成
通常,表的列代表不同的变量,行代表不同的变量值
不同变量须具有相同数量的变量值,即行数须相同,否则不完整
表的索引方法有两种,下标索引和字段索引
5.实例演示
%1_38
%:freexyn
%% 表格创建
xingming={\’zhangsan\’;\’lisi\’;\’wangwu\’} %用元胞数组的形式,创建表的每一列
xuehao={\’1001\’;\’1002\’;\’1003\’}
chengji=[89 95;90 87;88 84]
t=table(xingming,xuehao,chengji) %表格的创建:table函数+小括号输入变量
istable(t) %判断
%% 表格索引
t(1:2,2:end) %下标索引:1-2行,2-最后一列
t.xingming %字段索引:索引该字段(列名称)所指向的整列数据
t.chengji(2,1) %组合索引:成绩字段里第2行第1列
t.age=[20;19;21] %使用字段索引为表格添加变量(字段)名称,并赋值。默认添加至最后一列
size(t) %表格维度
%% 表格属性的应用
t.Properties %.表格的属性数据,是结构数组
t.Properties.VariableNames %二级索引获取属性里的变量名称
t.Properties.RowNames={\’1\’,\’2\’,\’3\’} %给行名称赋值。注:赋值应与属性值数值类型相同(属性是元胞数组,则赋值也以元胞数组形式)
%用途:赋予行名称后,可以作为索引使用
t(\’1\’,\’xuehao\’) %索引1行xuehao列的数据,形式类似于下标索引,下标即矩阵下标ij,而该索引以行与列的名称索引。
t(1,2) %下标索引,1行2列
t({\’1\’,\’2\’},{\’xingming\’,\’age\’})
1.39 表的数据处理
1.表的编辑(排序查找提取删除)、计算、与结构数组转换
2.认识函数
统计summary
与结构数组转换table2struct、struct2table
与元胞数组转换table2cell、cell2table
3.实例演示
%1_39
xingming={\’zhangsan\’;\’lisi\’;\’wangwu\’};
xuehao={\’1001\’;\’1002\’;\’1003\’};
chengji=[89 95;90 87;88 84];
t=table(xingming,xuehao,chengji)
%% 表格的统计
summary(t) %无法统计字符型元胞数组,可以对chengji双精度型进行统计处理(按列统计)
mean(t.chengji) %字段索引再mean函数(默认维度按列即字段名求均值)
mean(t.chengji,2) %2表示第2维度即按行求均值
t.pingjunzhi=mean(t.chengji,2) %使用字段索引并赋值
%% 表的排序、查找
sortrows(t,\’xingming\’) %按行排序,表格t按字段\’xingming’按字母升序
t(:,[1 2 4 3]) %用索引排序:任意行,列将3和4列互换
% t.pingjunzhi=[] %删除,用字段索引赋空值删除该列
tf=t.pingjunzhi>90 %查找平均值大于90的学生信息,返回逻辑值;
t(tf,:) %使用tf作为逻辑索引,索引表格中符合条件的学生的信息
%% 数据转换
t
s=table2struct(t) %表格转换为结构数组后,每一行都变为1个元素,因此是3行1列的结构数组
s(1) %第1个元素的值
struct2table(s) %反向转换
c=table2cell(t) %表格转换为元胞数组后,变量名称消失,变量值转换为元胞数组,其中多列的双精度值会自动拆分为多个单列表示
cell2table(c) %反向转换
1.40 表的读入写出
1.表与外部文件的读入和写出
2.认识函数
读入readtable
写出writetable
3.实例演示
%1_40
xingming={\’zhangsan\’;\’lisi\’;\’wangwu\’};
xuehao={\’1001\’;\’1002\’;\’1003\’};
chengji=[89 95;90 87;88 84];
t=table(xingming,xuehao,chengji)
writetable(t,\’student.txt\’) %写出数据到txt文件
stu=readtable(\’student.txt\’) %从txt文件读入数据
stu.chengji=[stu.chengji_1,stu.chengji_2] %上面写出再读入后,多列数据自动拆分,把拆分后的数据恢复成原先数据
stu.chengji_1=[]
stu.chengji_2=[]
writetable(t,\’student.xls\’) %写出数据到Excel文件
stu=readtable(\’student.xls\’) %从Excel文件读入数据
1.41 日期时间型
1. 日期时间型的概念及其简单应用
2.认识函数
日期时间datetime
持续时间duration
3.概念
日期时间型(Dates and Time)数据具有灵活的显示格式和高达毫微秒的精度,并且可以处理时区、夏令时和平闰年等特殊因素
日期时间型数据有以下三种表示方式
Datetime型,表示日期时间点,是存储日期和时间数据的主要方法,它支持算术运算,排序,比较,绘图和格式化显示
Duration型,表示日期时间的持续长度
CalendarDuration型(略)
4.实例演示
%1_41
%freexyn
datetime(2018,8,8) %创建日期时间型,输入参数为:年、月、日
t=datetime(2018,8,8,12,0,0) %输入参数为:年、月、日、时、分、秒
d=duration(3,2,0) %创建持续时间型,时长3小时2分0秒
years(1)
days(1)
hours(1)
%% 运算
t2=t+d %时间点和持续时间的运算结果仍为时间点
t3=t-d
t-days(4)
hours(1)+minutes(30)
t2>t %时间点的比较,时间越晚,则越大
t3>t
hours(1)>minutes(30) %持续时间的比较,时间越长,则越大
%% 显示格式
t %时间点的显示格式设置
datetime(t,\’Format\’,\’y-MM-dd\’) %时间点显示格式,使用format属性设置
datetime(t,\’Format\’,\’y-MM-dd HH:mm:ss eeee\’) %y M d H m s e分别代表年、月、日、时、分、秒、星期
d %持续时间显示格式设置
duration(d,\’Format\’,\’m\’) %m表示分钟,另外,h表示小时、s表示秒
%% 补充
[y m d]=ymd(t) %函数ymd获取时间点t中的年月日信息赋值给相应变量,另外,时分秒hms同理
dateshift(t,\’start\’,\’day\’,0:2) %时间推移方法获取时间序列,start表示返回一天的起点即0点,0:2推移2天
char(t) %日期时间型转换为字符型,转换后可用字符型规则处理数据
NaT %datetime型的数据,表示非时间,即缺失值。
1.42 缺失数据的处理
1.各类型缺失数据的创建、判断、替换、移位和处理方法
2.认识函数
替换standardizeMissing
替换为fillmissing
位置\’MissingPlacement\’
忽略\’omitnan\’
移除rmmissing
3.实例演示
%1_42
%% 各类数据缺失值的创建
a=[nan 1 2 3] %数值型缺失值
s=[string(missing) \”a\” \”b\”] %字符串型缺失值
t=[NaT datetime(2018,8,8)] %时间型缺失值
%missing函数可创建不同数值类型的缺失值
aa=[missing 1 2 3]
ss=[missing \”a\” \”b\”]
tt=[missing datetime(2018,8,8)]
isnan(a) %判断数值型
ismissing(a) %判断缺失值
ismissing(s)
ismissing(t)
%% 缺失值的替换
standardizeMissing(a,[2 missing]) %变量中参数替换为缺失值
standardizeMissing(s,[\”b\” missing])
standardizeMissing(t,[datetime(2018,8,8) missing])
fillmissing(a,\’constant\’,0) %变量中缺失值替换成参数,\’constant\’和0表示把缺失值替换为常数0
fillmissing(s,\’constant\’,\”fill\”)
fillmissing(t,\’constant\’,datetime(2019,9,9))
%% 缺失值的移位(排序)
sort(a,\’MissingPlacement\’,\’last\’) %把变量a中的缺失值移位到最后
%% 缺失值的运算
max(a) %忽略nan求最大值
sin(a) %nan的sin值就是nan
sum(a) %求和返回nan值
sum(a,\’omitnan\’) %忽略nan
sum(rmmissing(a)) %移除a中的缺失值
1.43 类型识别
1.判断数据的类型和类别
例如数值型(整数、浮点数、实数、无穷数、有限数、nan等)、字符(串)型、结构数组、元胞数组、表、函数句柄等
2.认识函数
变量信息whos
类型class
无穷大isinf
非值isnan
数值型isnumeric
实数isreal
有限值isfinite
综合判断isa
字符向量元胞数组iscellstr
3.简单总结数据类型
Matlab的基本类型(16个)
4.实例演示
%1_43
%freexyn
x=1
whos x
class(x)
isnan(x)
isnan(nan)
isinf(x)
isinf(1e309)
isnumeric(x)
isnumeric(\’a\’)
isreal(x)
isreal(1+2i)
isfinite(x)
isfinite(1e309)
isa(x,\’numeric\’) %判断数值型
isa(x,\’integer\’) %判断整数
isa(int16(1),\’integer\’) %判断int16(1)是否为整数
isa(x,\’int8\’) %判断x是否为8位整型
isa(int8(1),\’int8\’)
isa(x,\’float\’) %判断浮点型
isa(x,\’double\’) %判断双精度浮点型
isa(x,\’single\’) %判断单精度浮点型
isa(x,\’logical\’) %判断逻辑型
isa(true,\’logical\’)
isa(x,\’char\’) %判断字符型
isa(\’a\’,\’char\’)
isa(x,\’string\’) %判断字符串型
isa(\’a\’,\’string\’)
isa(\”b\”,\’string\’)
isa(x,\’struct\’) %判断结构数组
isa(x,\’table\’) %判断表数组
isa(x,\’cell\’) %判断元胞数组
isa(x,\’function_handle\’) %判断函数句柄
isa(x,\’datetime\’) %判断日期时间型
isdatetime(x)
iscellstr({\’11\’}) %判断元胞数组是否由字符构成(是)
iscellstr({11}) %同上(不是,是双精度数值)
(第四章下结束,后接第五章)
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 5733401@qq.com 举报,一经查实,本站将立刻删除。本文链接:https://fajihao.com/i/71885.html