时隔这么久又可以开始MATLAB系统的学习了,这一周都在忙多元变量统计分析这门课的课程设计,代码已经完成的差不多了,只剩下最后的课程报告了,等下周加把劲就能全部完成了。其实通过这次课程设计MATLAB的熟练水平也提高了许多,不过系统的学习不能落下,想要真正掌握任何一门计算机语言都要去系统的学习。
上次学习了MATLAB的矩阵操作,这可以说是MATLAB的核心了,因为MATLAB全称就是矩阵实验室的意思(Matrix Laboratory)。这次简单学习一下MATLAB的数据类型,做个了解就好。
MATLAB数据类型主要有整数、单精度浮点数、双精度浮点数三类。默认情况下,MATLAB对所有数值按双精度浮点类型进行存储操作。这时如果想将数据类型设置成整数类型时,需要用到转换函数:
函数 | 运算法则 | 示例 |
---|---|---|
floor | 向下取整 | floor(3.5) = 3;floor(-3.5)=4 |
ceil | 向上取整 | ceil(3.5)=4; ceil(-3.5)=-3 |
round | 去最接近整数,如小数部分为0.5,则向绝对值大的方向取整 | round(3.5)=4; round(1.4)=1 |
fix | 向0取整 | fix(1.3) = 1; fix(-3.5) = -3 |
复数
函数 | 说明 |
---|---|
complex(a,b) | 构造以a为实部,b为虚部的复数 |
real(z) | 返回复数z的实部 |
abs(z) | 返回复数z的模 |
i,j | 复数标识 |
img(z) | 返回复数的虚部 |
angle(z) | 返回复数z的辐角 |
conj(z) | 返回z的共轭复数 |
MATLAB用Inf
和-Inf
来表示正无穷量和负无穷量,NaN
表示非数值量。正负无穷量一般由于运算溢出产生,非数值量则是由于类似0/0,或者Inf/Inf类型的非正常运算产生。
结构
MATLAB的结构与C语言类似,一个结构通过字段存储不同类型的数据。一个结构相当于一个容器,可以把多个相关联的不同类型数据封装在一个结构对象中。
- 通过字段赋值创造结构
>> patient.name = 'zhang san';
>> patient.billing = 200;
>> patient.test= [2 4 6 4 2 3 6];;
>> patient
patient =
包含以下字段的 struct:
name: 'zhang san'
billing: 200
test: [2 4 6 4 2 3 6]
>> whos
Name Size Bytes Class Attributes
patient 1x1 610 struct
- 利用struct函数创建结构
>> patient = struct('name','john','billing',200,'test',[2 3 4 5 6 7])
patient =
包含以下字段的 struct:
name: 'john'
billing: 200
test: [2 3 4 5 6 7]
- 访问结构对象
>> patient(2).name = 'swift';
>> patient(2).billing = 500;
>> patient(2).test = [34 2 56 43 2]
patient =
包含以下字段的 1×2 struct 数组:
name
billing
test
>> patient(1).billing
ans =
200
>> patient(2).name
ans =
'swift'
- 连接结构对象
>> patient2 = [patient(1) patient(2)]
patient2 =
包含以下字段的 1×2 struct 数组:
name
billing
test
单元数组
元组是一种广义矩阵,一个单元可以包括一个任意数组,可以是数值数、字符串数组、结构体数组或其他数组。每一个单元具有不同的尺寸和内存占有空间。
- 创建单元数组
>> A = {'x',[2;3;4],2*pi};
>> B = cell(2,2);
>> A
A =
1×3 cell 数组
{'x'} {3×1 double} {[6.2832]}
>> B
B =
2×2 cell 数组
{0×0 double} {0×0 double}
{0×0 double} {0×0 double}
- 访问单元数组
单元外标识使用圆括号操作,C(m,n)表示第m行第n列的单元;单元内编址使用大括号进行操作,C{m,n}表示第m行第n列的单元中的内容。
>> A = {'x',[1 2 3 4];10,2*pi}
A =
2×2 cell 数组
{'x' } {1×4 double}
{[10]} {[ 6.2832]}
>> A(1,2)
ans =
1×1 cell 数组
{1×4 double}
>> A{1,2}
ans =
1 2 3 4
- 单元数组中的操作
合并操作:
>> A
A =
2×2 cell 数组
{'x' } {1×4 double}
{[10]} {[ 6.2832]}
>> b = {'janes'};
>> C = {A b}
C =
1×2 cell 数组
{2×2 cell} {1×1 cell}
删除操作:
>> A1 =A
A1 =
2×2 cell 数组
{'x' } {1×4 double}
{[10]} {[ 6.2832]}
>> A1{1,2} = []
A1 =
2×2 cell 数组
{'x' } {0×0 double}
{[10]} {[ 6.2832]}
改变形状操作:
>> A
A =
2×2 cell 数组
{'x' } {1×4 double}
{[10]} {[ 6.2832]}
>> newA = reshape(A,1,4)
newA =
1×4 cell 数组
{'x'} {[10]} {1×4 double} {[6.2832]}
函数句柄
创建函数句柄的一般语法格式:
Function_Handle = @Function_Filename;
>> F = @exp
F =
包含以下值的 function_handle:
@exp
>> x = 0:0.1:2
x =
列 1 至 13
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000 1.0000 1.1000 1.2000
列 14 至 21
1.3000 1.4000 1.5000 1.6000 1.7000 1.8000 1.9000 2.0000
>> F(x)
ans =
列 1 至 13
1.0000 1.1052 1.2214 1.3499 1.4918 1.6487 1.8221 2.0138 2.2255 2.4596 2.7183 3.0042 3.3201
列 14 至 21
3.6693 4.0552 4.4817 4.9530 5.4739 6.0496 6.6859 7.3891
映射容器
映射容器可以将一个量映射到另一个量。例如,一个字符串映射到一个数值,那么相应的字符串就是映射的键(key),相应的值就是映射的数据(value)。可以将Map容器理解为一种快速键查找数据结构。
一个键可以是以下任何一种数据类型:
- 1*N字符串
- 单精度或者双精度的实数标量
- 有符号或者无符号的标量整数
Map类的属性:
属性 | 说明 |
---|---|
Count | 无符号64位整数,表示Map对象中存储的Key/Value对的总数 |
KeyType | 字符串,表示Map对象中包括的Key的类型 |
ValueType | 字符串,Map对象中包括的数据类型 |
- 创建Map对象
k =
1×7 cell 数组
{'A'} {'B'} {'C'} {'D'} {'E'} {'F'} {'G'}
>> v = {23 345 236 457 213 267 654}
v =
1×7 cell 数组
{[23]} {[345]} {[236]} {[457]} {[213]} {[267]} {[654]}
>> obj = containers.Map(k,v)
obj =
Map - 属性:
Count: 7
KeyType: char
ValueType: double
- 查看和读取Map对象
>> keys(obj)
ans =
1×7 cell 数组
{'A'} {'B'} {'C'} {'D'} {'E'} {'F'} {'G'}
>> values(obj)
ans =
1×7 cell 数组
{[23]} {[345]} {[236]} {[457]} {[213]} {[267]} {[654]}
Map对象数据寻访:
>> obj('F')
ans =
267
>> values(obj,{'A','D','E'}) %访问多个键
ans =
1×3 cell 数组
{[23]} {[457]} {[213]}
- 编辑Map对象
删除
>> obj
obj =
Map - 属性:
Count: 7
KeyType: char
ValueType: double
>> remove(obj,'G')
ans =
Map - 属性:
Count: 6
KeyType: char
ValueType: double
增加:
>> obj('G') = 234
obj =
Map - 属性:
Count: 7
KeyType: char
ValueType: double
>> values(obj)
ans =
1×7 cell 数组
{[23]} {[345]} {[236]} {[457]} {[213]} {[267]} {[234]}
修改:
>> obj('A') = 123
obj =
Map - 属性:
Count: 7
KeyType: char
ValueType: double
>> values(obj)
ans =
1×7 cell 数组
{[123]} {[345]} {[236]} {[457]} {[213]} {[267]} {[234]}
数据类型和数据转换
函数 | 说明 |
---|---|
isnumeric | 判断是否为数值数组 |
isobject | 判断是否为MATLAB对象 |
isa | …归属特定的类 |
iscell | …单元数组 |
ischar | …字符数组 |
isreal | …实数 |
isscalar | …标量 |
isstruct | …结构数组 |
isvector | …向量 |
class | 判断对象所属的类 |
validateattributes | 验证数组有效性 |
whos | 列举变量类型相关的数据 |
isfield | 判断是否为类的字段 |
数据类型的转换函数:
函数 | 说明 |
---|---|
char | 转换为字符类型 |
int2str | 整数转换为字符串 |
mat2str | 矩阵转换为字符串 |
num2str | 数值转换为字符串 |
str2double | 字符串转换为浮点数 |
str2num | 字符串转换为数值 |
cell2mat | 单元数组转换为数值数组 |
cell2struct | 单元数组转换为结构数组 |
mat2cell | 数值数组转换为单元数组 |
cellstr | 从字符串中创建字符数组 |
num2cell | 数值数组转换为单元数组 |
struct2cell | 结构数组转换为单元数组 |