目录
1 变量
1.1 变量类型转换
double() | 转换为双精度 |
single() | 转换为单精度 |
int8() | 转换为8位有符号整数,占用1字节 |
int16() | 转换为16位有符号整数,占用2字节 |
int32() | 转换为32位有符号整数,占用4字节 |
int64() | 转换为64位有符号整数,占用8字节 |
unit8() | 转换为8位无符号整数 |
unit16() | 转换为16位无符号整数 |
unit32() | 转换为32位无符号整数 |
unit64() | 转换为64位无符号整数 |
1.2 字符和字符串
- 字符在ASCll表中使用0到255之间的数字代码表示
- 通过将字符或字符串放入一对单引号创建字符或字符串
字符
x = 'h' % 把h字符赋给了x变量
字符串
s1 = 'Example';s2 = 'String'; % 把字符串赋予给变量
s3 = [s1 s2];s4 = [s1;s2]; % 字符串级联
逻辑操作与分配
- 许多数值运算符和逻辑运算符可以应用于字符串:
>> str = 'Example';
>> 'a' == str %判断str中的为a的元素
ans = 0 0 1 0 0 0 0
>> str(str == 'a') = 'z' %把a改成z
str = Exzmple
练习1
s1 = 'I like the letter E';
s2 = s1(end:-1:1) %s1反过来
1.3 结构体
- 一种存储异构数据的方法。
- 结构体包含称为字段的数组。
- 学生作业成绩:
% 第一种添加结构体的方法
student.name = 'John';
student.id = 'xxx';
student.number = 10000000;
student.grade.chinese = [85 86;87 89];
student.grade.math = [100 99;80 84];
% 第二种添加结构体的方法(嵌套结构体)
student(2) = struct('name','Alice','id','yyy','number',10000001,'grade',...
struct('Chinese',[66 77;88 99],'math',[33 44;55 66]));
结构体函数
cell2struct | 将元胞数组转换为结构体数组 |
fieldnames | 结构的字段名或对象的公共字段 |
getfield | 结构数组的字段 |
infield | 确定输入是否为结构数组字段 |
instruct | 确定输入是否为结构数组 |
orderfields | 结构数组的有序字段 |
rmfield | 从结构中移除字段 |
setfield | 为结构数组字段赋值 |
struct | 创建结构数组 |
struct2cell | 将结构体转换为元胞阵列 |
structfun | 将函数应用于标量结构体的各个字段 |
1.4 元胞数组
- 另一种将异构数据存储在矩阵中的方法
- 与矩阵相似但每个条目包含不同类型的数据
- 使用{}表示
表示出如下元胞数组:
% 第一种方式
A(1,1)={[1 4 3;0 5 8;7 2 9]};
A(1,2)={'Anne Smith'};
A(2,1)={3+7i}; A(2,2)={-pi:pi:pi};
A
% 第二种方式
A{1,1}=[1 4 3;0 5 8;7 2 9];
A{1,2}='Anne Smith';
A{2,1}=3+7i; A{2,2}=-pi:pi:pi;
A
特点:
- 元胞数组中的每个条目都持有数据结构的指针
- 同一细胞的不同细胞可以指向不同类型的数据结构
练习2
表示出如下数组:
% 第一种方式
B(1,1)={'This is the first cell'};
B(1,2)={[5+6j 4+5j]};
B(2,1)={[1 2 3;4 5 6;7 8 9]};
B(2,2)={{'Tim' 'Chris'}};
B
% 第二种方式
B{1,1}='This is the first cell';
B{1,2}=[5+6j 4+5j];
B{2,1}=[1 2 3;4 5 6;7 8 9];
B{2,2}={'Tim' 'Chris'}
B
访问元胞数组
大括号{}用于访问元胞数组的“内容”。
C = A(1,1) %不读取内容
D = A{1,1} %读取内容
元胞数组函数
cell | 创建元胞数组 |
cell2mat | 将元胞数组转化为数字数组 |
cell2struct | 将元胞数组转化为结构体数组 |
celldisp | 元胞数组内容 |
cellfun | 应用函数于元胞数组中的每个元胞 |
cellplot | 元胞数组图形显示结构 |
cellstr | 从字符数组创建字符串元胞数组 |
iscell | 确定输入是否为元胞数组 |
mat2cell | 将数组转换为具有不同大小元胞的元胞数组 |
num2cell | 将数组转换为具有一致大小元胞的元胞数组 |
struct2cell | 结构体转换到元胞数组 |
- num2cell()和mat2cell
a = magic(3) %奇异矩阵,每行、每列、对角线的和为15
b = num2cell(a) %将数组转换为相同大小的元胞数组
c = mat2cell(a,[1 1 1],3) %将数组转换为在元胞中包含子数组的元胞数组。[1 1 1]这个位置为行,代表分为了三个1行;3的位置为列,代表一个3列。
A = zeros(60,50);
C = mat2cell(A,[10 20 30],[25 25]);
1.5 多维数组
表示出如下多维数组:
A{1,1,1}=[1 2;4 5];A{1,2,1} = 'Name';
A{2,1,1} = 2-4i; A{2,2,1} = 7;
A{1,1,2} = 'Name2';A{1,2,2} = 3;
A{2,1,2} = 0:1:3; A{2,2,2} = [4 5]';
1.6 数组级联
- cat()
表示出如下图所示的数组:
%%数组级联cat()
A=[1 2;3 4];B=[5 6;7 8];
C=cat(1,A,B) %1代表行联,2代表列联,3代表页联
- reshape()
%%返回一个具有指定行和列的新数组reshape
A={'James Bond',[1 2;3 4;5 6];pi,magic(5)}
C = reshape(A,1,4)
1.7 检查变量和变量状态
isinteger | 确定输入是否为整数数组 |
islogical | 确定输入是否为逻辑数组 |
isnan | 检测一个不是数字的元素(NaN) |
isnumeric | 确定输入是否为数字数组 |
isprime | 检测数组的各元素 |
isreal | 确定所有数组元素是否为实数 |
iscell | 确定输入是否为元胞数组 |
ischar | 确定输入是否为字符数组 |
isempty | 确定输入是否为空数组 |
isequal | 确定数组是否数值相等 |
isfloat | 确定输入是否为浮点数组 |
isglobal | 确定输入是否为全局变量 |
ishandle | 检测有效的图形对象手柄 |
isinf | 检测数组的无穷大元素 |
2.档案存取
支持的文件格式:
文件内容 | 扩展名 | 描述 | 输入函数 | 输出函数 |
---|---|---|---|---|
MATLAB格式化数据 | MAT | 保存MATLAB工作区 | load | save |
文本 | 空间分隔数 | load | save | |
工作表 | XLS,XLSX | xlsread | xlswrite |
2.1 存取
- 保存工作区中的所有数据到文件:
clear; a = magic(4);
save mydata1.mat %用其他应用浏览无法看到变量的具体内容
save mydata.mat -ascii %用其他应用浏览可以看到变量的具体内容
- 从文件中载入数据:
load('mydata1.mat') %变量名称存在
load('mydata2.mat','-ascii') %-ascii储存的信息少,载入后无变量名称
2.2 Excel文件的读写
- 读取:
Score = xlsread('04score.xlsx')
%%读取特定位置的表格
Score = xlsread('04score.xlsx','B2:D4')
- 写入:
M=mean(Score')'; %求每行的平均并转置
%%在Sheet1的E2:E4写入M,在E1写入Mean
xlswrite('04score.xlsx',M,1,'E2:E4');
xlswrite('04score.xlsx',{'Mean'},1,'E1');
S = std(Score')'; %求每行的标准差并转置
xlswrite('04score.xlsx',S,1,'F2:F4');
xlswrite('04score.xlsx',{'Std'},1,'F1');
- 在Excel电子表格中获取文本并写回:
%%Score为数组,Header为字符串
[Score Header]=xlsread('04Score.xlsx')
%%再次写入Excel表格
Score = num2cell(Score);
Header(2:4;2:4) = Score;
xlswrite('04score.xlsx',Header,1,'A1:D4')
2.3 低级文件输入/输出
- 在字节或字符级别读取和写入文件
- 文件中具有一个ID fid
- 文件的位置是由可移动的指针指定的
低级文件I/O函数
fopen | 打开文件,或获取有关打开的文件的信息 |
fclose | 关闭一个或全部打开的文件 |
fsanf | 从文本文件读取数据 |
fprinf | 写入数据到文本文件 |
feof | 到文本文件测试 |
- 将正弦值写入文件
x = 0:pi/10:pi; y = sin(x);
fid = fopen('sinx.txt','w'); %打开文件
for i=1:11
%写入,%5.3f表示3位小数,\n是换行
fprintf(fid,'%5.3f %8.4f\n',x(i),y(i));
end
fclose(fid); %关闭文件
type sinx.txt %显示文件内容
通过格式化的I/O读写
%%format:格式
A = fscanf(fid,format,size); %读
fprint(fid,format,x,y,...); %写
- 说明符描述:
%c | 单字符 | %o | 八进制表示法(无符号) |
%d | 十进制表示法(有符号) | %s | 字符串 |
%e | 指数表示法 | %u | 十进制表示法(无符号) |
%f | 浮点表示法 | %x | 十六进制表示法 |
%g | %e和%f的结合 |
- 读取文件(asciiData.txt):
fid = fopen('asciiData.txt','r'); i = 1;
while ~feof(fid) %检测文件末尾,这里不是末尾时执行循环,到末尾退出循环
name(i,:) = fscanf(fid,'%5c',1);
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');
%fscanf读取文本文件中的数据
i=i+l;
end
fclose(fid); %关闭文件