实验二 元胞和结构定义
一.实验目的
1较熟练地掌握矩阵元素的访问
2进一步掌握矩阵中的关系运算的特点及索引地使用,分辨出元胞数组与结构数组之区别,灵活地控制调用结构体数组里元素。
二.实验类型
设计型
三.实验内容:
1自行产生一个5行5列的数组,用两种方法得到最中间的三行三行矩阵。
2根据a=reshape(-4:4,3,3)做一个矩阵,然后(1)取出所有大于0的元素构成一个向量(可推广到从一个矩阵里筛选出符合条件的元素组成一个向量)(2)将原矩阵中大于0的元素正常显
示,而小于等于0的元素全部用0来表示(可推广到将原矩阵中不符合条件的全用0来表示,符合条件的值不变)。
3建立如下一个元胞数组,现在要求计算第一个元胞第4行第2列加上第二个元胞+第三个元胞里的第二个元素+最后一个元胞的第二个元素。
a={pascal(4),'hello';17.3500,7:2:100}
4建立一个结构体的数组,包括3个人,字段有姓名,年龄,分数,其中分数由随机函数产生一个3行10列的数据表示了有10门课程,每门课程有三个阶段的分数。问题是:
问题1,如何到第2个人的分数并显示出来
问题2,如何到第2个人的每门课程3个阶段的平均分数并显示出来
问题3,全班同学的10门课程的每门课程的平均分如何计算出来?要求放到一个数组里。
问题4,到这个班所有同学的姓名放到一个元胞数组里
5给定一个图像文件,格式是jpg,通过inportdata引入这个文件,查看引入后数据保存是一个数组,是100*100*3的一个数组,这是一个三维的数组,表明有100*100个点,每个点有RGB三个方面决定的。现在,要求将这些点的中间部分30个象素宽度的正方型用黑点表示。
7将一个矩阵转化成结构体:有三个一维向量分别表示若干个点(5个点)的RGB值,如R=255*rand(1,5),G =255*rand(1,5),B=255*rand(1,5)。将这三个一维向量组成一个5*3矩阵(5表示5个点,3表示每个点有三个值)。然后将这个表示若干点值的矩阵转化成元胞数组,最后将元胞数组转成包含R,G,B三个属性的结构体。
四.实验步骤:
1.仔细阅读Matlab帮助文件中有关以上函数的使用说明,能充分理解其使用方法并能运用它们完成实验内容。
2.先建立一个5*5的矩阵,然后可以通过使用索引访问矩阵元素的多种方法中的访问由指定的向量I,和向量J来指定。本题还可以通过空数组的方式来得到,空数组产生的主要目的就是为了删除空间,我们可以先将这个5*5矩阵的第1,5行设置为空,再将第1,5列设置为空即
可。
3首先建立一个矩阵,然后用关系运算符出大于0的索引矩阵,根据这个索引就可以得到满足条件的矩阵了,第二个问题,是需要使用两个数组的点积运算。
4.元组数组的设置可以由多种方式,但总体来说,还是一个数组(矩阵,可看作是广义矩阵),元组数组里的元素我们称为元胞,要想访问元胞里的元素,我们必须使用{},而不是(),元素里的部分内容的访问需要用到()。因此,本题先建立元胞数组,再访问元胞元素里的分量,加起来即可。
5.结构体数组的建立方法有两种,第一种是通过struct关键字来引导的建立方法,这种方法相当于初始化赋值数据,数据必须被{}包着,很象元胞元素;第二种是直接给某一个结构体赋值,实际上是给它的某个属性赋值,赋值的数据就是一般的数据格式。
本题首先建立结构体数组,结构体里有三个字段,可以先建立student(1)的各个字段,然后再建立student(2),依次类推。另外,在建立分数字段的时候用到了rand函数,用这个函数建立3行10列的矩阵,表示10门课程,每门课程有三次成绩。
问题1要得到某个人的成绩,需要用()的方式访问数组里某个人,然后再用“.”来操作其成员数据。
问题2求每个人的平均分,需要用到mean函数。
问题3要得到全班所有人(实际给出3个人),每个人10门平均分,有两种方法:方法一,可以借助问题2的方法先求出第1个人的平均分,再求第2人的平均分,再求第3个人的平均分,然后用[a1;a2;a3]将平均分组合起来变成一个平均分矩阵,最后再求一次平均分即得到结果。
方法二,就应该预先建立一个3*10的矩阵meanss,这个矩阵预先都放0,注意矩阵的赋值方式:meanss(3,10)=0。然后,用循环的方式将求出来的第i个人的平均分交给矩阵meanss相应的第i行。
问题4,要将姓名放在一个矩阵里,有两种方法。
第一种方法可以使用strvcat这个函数来将不同长度的字符串接合在一起,如names=strvcat(names,student(1).name)就接合了第一个人的姓名,用这种方法可以接合多
个字符串,如果编程解决的话,只要使用循环即可完成任务。
第二种方法,保存不同长度字符串使用元胞数组是非常方便的,因为不同的元胞元素结构、长度等一切皆可不同。首先定义一个空元胞,例如names=cell(1),然后从结构体里取出姓名依次放入元胞元素中去即可,格式如names{1}=第1个学生的姓名。若是编程来解决这个问题,思路也是一样的,只不过,需要使用循环。
6.在所有的数据类型中,只有元胞数组和结构体类型最相似,因为它们都可以表示不相干的数据,因此基于这点,系统提供了元胞数组和结构体相互转化的函数。本题要求将一个一般的矩阵转成结构体,思路是:一般矩阵元胞数组结构体。
而元胞转结构体要满足一定的格式要求,这个格式如下:
字段名1(如R) 字段名2(如G) 字段名3(如B)
字符串转数组matlab 233 123 45
243 88 185
…
根据给定的题目条件,有3个RGB的向量,R=255*rand(1,5)G =255*rand(1,5)
B=255*rand(1,5)这三个向量是行向量。我们首先要把这3个向量整合成上表的模样一般矩阵,以便于转化得到的元胞满足向结构体转化的条件。
一般矩阵元胞数组转化需要使用函数num2cell
元胞数组结构体转化需要cell2struct,使用这个函数,必须先定义一个字段名元胞fields={'red','green','blue'},这个元胞fields作为cell2struct函数的参数引入,以便于能够分清楚,各列数据属于哪个字段。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论