目录
6、多维数组(Multidimensional Array)
一、变量
1、变量类型转换
eg:
我们在命令窗口输入A=20,可以看到变量A的类型是double
然后我们执行 B=int8(A),可以看到变数B的类型发生了转换
2、字符(char)
表示一个字符,eg: s1='h',注意要是用单引号框起来
*使用whos可以查看当前存在的变量及类型:
3、字符串(string)
表示多个字符,eg:s1='example',s2='string'
①字符的连接:s3=[s1 s2]; %[ ]起到连接的作用
s4=[s1;s2]; %s1有7个长度,s2有6个长度,维度不同
②数字和逻辑运算也可以用字符串
eg:str=='aardvark';==>str(3)='a'
'a'==str %==是逻辑运算,比较str的每一个字符是否等于a,每一个字符都与'a'做逻辑运算
str(str=='a')='z',首先我们知道str=='a'的结果是11000100,那么就变成了str(11000100),那么可以看出运行的结果就是'a'的位置都变成'Z'了。
如果要比较整个字符串,可以使用strcmp函数,tf=strcmp(str1,str2),逐位比较字符串str1与str2,如果完全相等则tf=1,否则tf=0。
>> str1='arrdvark';
>> str='zzrdvzrk';
>> strcmp(str,str1)
ans =
logical
0
ex:编写一个脚本来反转任何给定的字符串
s1='I like the letter E';
%第一种,利用for循环
L=strlength(s1); % 计算s1的长度
for i=1:L
s2(i)=s1(L+1-i); %实现字符串的反转
end
%第二种,直接利用-1步长从尾到头
s2=s1(size(s1,2):-1:1);
结果:
>> s2
s2 =
'E rettel eht ekil I'
4、结构体(structure)
用来存储异构数据,s = struct(field1,value1,...,fieldN,valueN)
eg:记录班级的学生信息:field1=name,name的具体内容是Tom,name的变量类型是string
如果想要单独显示grade,则进行如下操作:
如果班级的学生不止一个,那么可以采用student(2).name='Ann',同理进行。
ex:找到Ann Lane的第三个成绩
下面给出structure常用的函数语句:
eg:fieldnames()的作用是将structure中的各个field的名称进行抓取
rmfield()的作用是将某一个field移除
structure的field可以是string,当然也可以是structure,例如下图所示,Project的field中,Name的类型是string,Compendia的类型是structure
eg:
field | 变量名称 | 变量内容 | 变量类型 |
1 | data | [3 4 7;8 0 1] | matrix |
2 | nest | struct |
field | 变量名称 | 变量内容 | 变量类型 |
1 | testnum | Test 1 | string |
2 | xdata | [4 2 8] | matrix |
3 | ydata | [7 1 6] | matrix |
变量A含有两个field,分别是data与nest
A中的field2对应的struct中含有三个field:
如果structure含有很多field,举例如下:
那么我们在命令行输入s(1),可以得到如下结果:
输入s(2),结果如下:
可以看出,s(1)与s(2)就是将s的所有字段进行取值,分别取第一行与第二行
5、元胞数组(cell array)
如上图所示,给出一个变量A的内容,那么我们可以构建一个cell,用{}表示,有以下两种表示方式:
①第一种:A(*,*)={ }
②第二种: A{*,*}=
从下图我们可以看出,每一个元素(entry)都指向一个变量
ex:
那么怎么读取cell呢?直接使用A(1,1)无法看出具体的内容,要看内容应该使用{}即A{1,1}
*小括号()读取的是指针,大括号{}返回的事具体内容
如果想进一步得到A{1,1}中矩阵的第一个元素呢,我们可以将A{1,1}整体看做一个矩阵然后使用A{1,1}(1,1)得到第一个元素:
cell array的函数:
①structure与cell是可以相互转换的,利用cell2struct()函数与struct2cell()函数
②num2cell()与mat2cell()函数
eg:
这里我们给出的a是一个3×3的幻方矩阵:
经过转换后的b:每一个entry都是cell的entry
如果我们要将每几个entry进行转换,采用mat2cell(input,rowDist,column)函数,其中第一个变量是给出输入的matrix,第二个变量给出的是进行分块的行的数目,第三个变量是给出的列。以下图为例,c=mat2cell(a,[1 1 1 ],3),其中a是一个3×3的幻方矩阵;[1 1 1],分成了三个行数为一的矩阵,三个矩阵总行数相加正好为a的行数;3表示每个矩阵的列数,正好也是矩阵a的列数。以上分析可知c=mat2cell(a,[1 1 1 ],3)将矩阵按照行分成了三个1×3的矩阵,结果如下:
c:
6、多维数组(Multidimensional Array)
eg:
①第一种方式:A{row,column,layer},适用于比较简单的结构
②第二种方式:cat()函数,比较方便
那么我们上面给出的例子就可以化简为以下形式:
补充:reshape()函数,假设一个matrix是r1×c1,那么使用reshape()函数,可以重新构造一个r2×c2的新的matrix,但必须满足r1×c1=r2×c2。使用方式有以下两种:
①B=reshape(A,sz),其中sz是一个向量来决定matrix B的规格并且sz至少两个元素,例如B=reshape(A,[2 3])将matrix A重构成一个2×3的matrix B。
②B=reshape(A,sz1,sz2,......,szN),其中sz1到szN规定了每一个对应维度的大小,当然也可以使用[ ],那么这个维度的大小将自行计算,例如matrix A的规格是10×10,B=reshape(A,2,2,[])将matrix A重构成2×2×25的matrix B。
不仅仅是矩阵,cell也可以使用reshape()函数,举例如下:
ex:
判断变量的类型:
二、档案读取
如何将work space里的数据存储到file中,又如何将file中的数据读到work space中。
MATLAB存储数据的方式第一种是存储在work space中,第二种是存储为text,最后一种比较高阶的方式是存储为excel。前两种方式读取数据使用load()函数,存储数据使用save()函数,第三种使用xlsread()读取数据,xlswrite()存储数据。
1、save()和 load()
上面的例子是将work space的变量a存储在mydata1文件中,找到mydata1.mat文件打开我们是无法清楚的读取到存储的四阶幻方矩阵a的,想要正确的读取,应该采用以下指令:
save mydata2.mat -ascii
那么从file中读取数据到work space使用load(),执行以下指令后,我们可以在 work space中看到:
load('mydata1.mat')
由于存储mydata2时,采用的ASCII码,所以读取的时候也要使用ASCII码进行读取,否则无法正确读取:
load('mydata2.mat','-ascii')
如果work space中有很多变量,我们只想存储某个特定的变量又该如何操作呢?
ex:
2、Excel文件读取:xlsread()
建立excel如下:
注意:在桌面建立excel,进行存储的时候会发现路径报错,所以我们应该在MATLAB的文件夹下存储excel。
进行文件读取,执行下面的指令只会读取到excel的数据:
Score=xlsread('04Score.xlsx')
如果读取excel中的某些范围数据,执行下面的指令读取的是B2到D4的数据:
Score=xlsread('04Score.xlsx','B2:D4')
3、Excel文件的写入:xlswrite()
计算excel的平均值并写入excel,但注意要把excel关掉运行:
执行下面的代码:
M=mean(Score')';
xslwrite('04Score.xlsx',M,1,'E2:E4');
*注意:mean()是按列计算,而我们要求的平均数是每个人的三个数据的平均,因此要将Score先转置即Score'得到一个1×3的行向量,存储的时候是3×1的列向量,因此又要进行一次转置,所以就是M=mean(Score')'
打开excel可以看到:
如果想要把标头写进去,那么执行如下:
xlswrite('04Score.xlsx',{'Mean'},1,'E1');
得到结果:
ex:计算标准差并写入F
*std()函数用来计算标准差
STD=std(Score')';
xlswrite('04Score.xlsx',STD,1,'F2:F4');
xlswrite('04Score.xlsx',{'Standard Deviations'},1,'F1');
打开excel:
上面介绍的函数可以帮助我们实现excel与MATLAB之间数据的读取与写入,但如果我们也想读取excel表格的标题应该怎么办呢?
4、Excel的标题读取
同时读取数据和标题:
执行以下指令:
[Score Header]=xlsread('04Score.xlsx')
结果如下:
那么如何将标题与数据同时存储在一个excel文件中?
ex:
5、低阶文件输入输出
首先file必须要有一个ID才能正确的打开文件也就是fid,其次需要一个文件指针(pointer)去准确的读取我们想要的数据。
①打开和关闭文件
permission:给定文档的权限,可以读可以写等等。
②数据的读和写
eg:
首先我们要产生x与y,然后打开一个file,再将x与y写入file,最后关闭file。
x=0:pi/10:pi; % 产生x
y=sin(x); % 产生y
fid=fopen('sinx.txt','w');% 打开一个文档,权限是写入
for i=1:11
fprintf(fid,'%5.3f %8.4f\n',x(i),y(i));% 将x与y写入文档,%5.3f说明总共的数是5个小数点后有3个,\n是换行
end
fclose(fid); % 将文档关闭
type sinx.txt % 看内容
ex:
建立如下txt文件:
使用MATLAB读取文件:
fid=fopen('asciiData.txt','r'); % 打开需要的txt文件,权限是读取数据
i=1;
while ~feof(fid) % feof()函数用来判断是否读取到文档的结尾,feof(fid)=1则说明读完了文档
name(i,:)=fscanf(fid,'%5c',1); % :是所有列的意思,%5c是读取5位长度的字符。因为name是char格式,他的第一列就是j一个字母,第二列是o以此类推
year(i)=fscanf(fid,'%d',1);
no1(i)=fscanf(fid,'%d',1);
no2(i)=fscanf(fid,'%d',1);
no3(i)=fscanf(fid,'%g',1);
no4(i)=fscanf(fid,'%g\n');
i=i+1;
end
fclose(fid);
得到结果如下: