参考链接:心心水滴论坛古木小永主要数据结构包括数组,字符串,胞,结构体的用法,下面依次介绍1数组1.1数组的创建创建数组的方法有很多,首先先讲一下如何手动去输入一个数组。
比如我现在有两组数据,分别对应的是5个被试的身高以及体重,我想身高数据放在第一列,数据位178,167,170,156,182,第二列数据为体重数据,其对应为65,50,63,70,67。
我们想把这两组数据存在一个变量Data上,这个时候我们只要在matlab命令框中输入>>Data = [178,65;167,50;170,63;156,70;182,67]→ Data=178 65167 50170 63156 70182 67这里可以发现对于一堆数据的输入,可以先用一个中括号把所有数据括起来,一行的每个数据用逗号隔开或者可以通过空格,比如下面例子,行与行之间用分号隔开。
Data2 = [1 2 3;4 5 6]→ Data2=1 2 34 5 6如果每个数据都需要这样输入,那么会很麻烦,这里就提供了一些简单的方法来输入比较规整的数据。
1. >>A = 1:5→ A =1 2 3 4 52. >>B = 1:2:10→ B =1 3 5 7 9可以看到如果我们想输入一列数据,并且这些数据是以等差数列的方式排布,我们就可以用a:b:c这样的形式来写,意思就是从a开始,每隔b有一个数据,然后写直到不大于c这样一组数。
当然其中b可以省略,省略默认b的值为1。
1.2数组的合并(这里要用到上面的A,B变量)>> C = [A;B]→ C =1 2 3 4 51 3 5 7 9>>D = [A,B]→ D =1 2 3 4 5 1 3 5 7 9%其中A和B都是一个数组,如果其能保证对齐,那么这些数组是可以合并的,就好像上面的两条命令。
可以发现如果用分号,那么合并的情况是以列的方式合并,如果用逗号,那么是以行的方式合并,这个和手动输入数组是一致的,只不过把前面的数字当成数组来操作就可以了。
1.3数组内部数据的取得(这里要用到前面的Data变量)输入的方法我们有了,但我们如何来取出一个数据呢?先看看命令>>Data(4,1) → ans = 156如何取出一行数据>>Data(3,:) → ans = 170 63%和上面所说的一样,前面那个数代表行数,后面如果我们想取所有的数据,只需要在逗号后面写1:end就可以了,也就是第三行的对应的第一列到最后一列的数据,可以简写为一个冒号。
同理比如取出第一列的数据可以写成>>Data(1:end,1) 或者 Data(:,1)但我们有的时候不希望取出一整列的数据,而是想选出某列当中的几行数据,这个时候我们就可以发现其实数据取得前面是管行,后面是管列,并且看到1:end这个就可以联想到我们前面所演示的如何输入规整的数组。
说白了这个1:end其实就是一个数组,如果是这样,我们就可以以此类推,如果我想输出第二列的第一,三,五行数据,那么命令就是>>Data([1,3,5],2)%输出的结果我就不演示了,大家可以尝试一下。
1.4数组内部数据的修改以及增添同样我们可以用上面的Data变量,比如我现在发现我在Data里面有个数据是错的,比如第4行的第二个数据觉得有问题,通过查看我们原始的数据发现第四个人的体重不是70而是50,那么我们就需要修改原始的数据。
如果重新输入一遍那就太蛋疼了,所以修改数据是非常关键的。
有了上面的一些经验,我们来看看如何修改这个数据>> Data(4,2) = 50→ Data =178 65167 50170 63156 50182 67%在这里我们发现Data数据变了。
如果我们想改一行数据,比如第三行数据应该是180,61,命令是>> Data(3,:) = [180,61]→ Data =178 65167 50180 61156 50182 67%这里要注意我们要改写一行,一列数组,那么后面的数据尺寸一定要和前面那行或者列的尺寸相同。
假如我们想改这个Data的第一列的第一,三行的数据,分别改为150,160 ,这个时候我们输入的方法就是>>Data([1,3],1) = [150,160]1.5数组的运算>> A = 1:5;>> B = A + 5B = 6 7 8 9 102字符串2.1字符串的创建字符串的创建和数组的创建还是有一定的区别,使用单引号将所需要的字符括起来就可以(这里对比数组,数组是用中括号将数字括起来)>>A = …hello world‟A = hello world%这里我们就建立了一个字符串变量,变量的内容就是hello world,同时我们可以再workspace当中查看这个变量。
注意:1. 这里的单引号必须是英文字符的单引号,如果在中文输入法的情况下输入这个单引号是会出现错误的,这个事初学者经常会犯的错误。
不能用双引号,会报错。
2. 字符串是用单引号括起来就可以,但我们想输入单引号这这个字符,那么就要在单引号的前面再加一个单引号,比如我想生成一个字符串是Tom‟s cat,这个时候的命令就是>>A= …Tom‟‟s cat‟A =Tom‟s cat2.2字符串的合并数组可以实现合并,如果维数匹配,那么两个数组可以合并成一个数组,那么字符串也可以合并,其合并的方法和数组的合并一样,譬如>>A = …hello‟;%这里在命令的后面使用了分号,这个分号的意思就是运行这行命令,但不将结果显示出来,所以这个命令的意思就是创建一个变量名为A的字符串,并且变量A的内容是hello>>B= …world‟;%创建字符串B>>C= [A,B] %将A,B这两个字符串以水平方式合并起来,结果见下面C = helloworld>>D= [A;B] %将A,B这两个字符串以垂直方式合并起来,结果见下面D =helloworld最常用的还是水平合并2.3字符串的使用现在我们先创建一个字符串,比如是一个数据的文件名>>filename = …data.txt‟;这个时候我们只是想看看这个文件是什么类型的文件,也就是我们需要将后面三个字符取出来,而不去管其它的内容,获取的方法和数组的使用方法一致,可以使用括号来实现这个功能,譬如>>filename(end-2:end) %这个命令的意思是取出这个字符串倒数第三至最后一个字符ans = txt如果我们想取出前面文件名那部分,而不想关注后面的数据类型,这时候使用方法如下>>filename(1:end-4) %取出字符串的第一个至倒数第五的字符ans = data2.4字符串的修改这个可以参照数组的用法,这里就不详细的解释了,如果有问题可以参考数组的用法>>A = …helloworld‟; %创建字符串>>A(6:10) = …China‟%将helloworld中的world改成ChinaA = helloChina注意: 这里赋值号后面所跟的字符数量要和前面A中要修改的字符数量相同,如果不匹配的话是会出现错误的。
2.5字符串的其它用法数组的其中一个用法就是在数组后面的括号中加入一个逻辑变量数组,这样就可以取出逻辑数组中那个对应是true的那个位置的值,这个用法在字符串中同样适用。
譬如>>A= …helloChina‟;>>index= A~=‟h‟ %取出helloChina 当中不是h这个字符的位置返回一个逻辑数组,这个数组的意思就是当helloChina当中不等于h的那个位置为true,否则为falseindex= 0 1 1 1 1 1 0 1 1 1>>B= A(index)B = elloCina这个用法经常会用来去除字符串当中的空格,在这里就先注意一下。
3胞好比“数组”是个容器(这里我们将字符串也当成数组看待),它可以装很多相同类型的数据。
但后面经常会碰到我们希望找到一个更大的容器能装各式各样的“数组”,这个时候我们就用到了胞(cell)。
在我眼中胞就是一个能装各种各样数据类型的这么一个容器,可以装前面所讲的所有的数据类型,还可以装后面要讲的结构体,甚至胞还可以自己装自己,也就是一个胞中套一个胞。
3.1胞的创建数组的创建是用方括号,数组的调用要用到小括号,胞的创建是用花括号,胞的调用既可以用小括号,也可以用花括号,但效果不一样。
对于胞的调用会在后面详细的介绍,但前面所说的这些括号的使用是很多初学者经常弄混的,所以这个需要大家注意一下。
胞的创建要用花括号,譬如:>>A = {…helloworld‟ , true, [1,2,3,4]}A = 'helloworld' [1] [1x4 double]这里我们创建了一个胞,这个胞里面有三个元素,第一个元素是一个字符串,字符串的内容是helloworld,第二个元素是一个逻辑型变量,其值为true,第三个元素是一个数组,数组里面有4个整型变量。
创建的方法很简单,用花括号将要放在一起的东西括起来,然后用逗号或者分号隔开,分号和逗号的使用和在创建数组时是一样的。
看起来胞很难用,乱七八糟的一堆东西,但在后面用的过程中,胞里面的所存的东西一般都是同一种类型的,比如要么都是数组,要么都是字符串。
这里也只是显示一下胞的里面是可以装各种各样的数据类型。
当然胞里面也可以装变量,譬如>>M = …helloworld‟;>>N = …Tom‟‟s cat‟;>>A = {M , N , [1,2,3,4]}A = 'helloworld' 'Tom's cat' [1x4 double]3.2胞中元素的调用(重点与难点)比如我们现在有一堆字符串组成了一个胞,这个时候我们如何来调用这个字符串是一个很重要的问题。
在前面我有说过胞的调用既可以使用小括号,也可以使用花括号,下面我们来看看其区别在什么地方。
>> A ={'data1.txt','data2.txt','data3.txt'}; %创建一个胞,里面有三个字符串>> M = A(1) %将A(1)这个东西存到M这个变量中M = 'data1.txt'>> N = A{1} %将A{1}这个东西存到N这个变量中N = data1.txt这个时候我们可以在workspace中看到,M这个变量的属性是1*1cell,而N这个变量的属性是字符串。