第3章 数据类型与运算符

第3章 数据类型与运算符

3.1 数据类型

3.1 数据类型

3.1.1 数值型

3.1.1.1 整数型

数据类型 数据类型表示范围 类型转换函数
有符号1B(8bit)整数(单精度) \(-2^7 \sim 2^7 - 1\) int8
有符号2B(16bit)整数(单精度) \(-2^{15} \sim 2^{15} - 1\) int16
有符号4B(32bit)整数(单精度) \(-2^{31} \sim 2^{31} - 1\) int32
有符号8B(64bit)整数(单精度) \(-2^{63} \sim 2^{63} - 1\) int64
无符号1B(8bit)整数 \(0 \sim 2^8-1\) uint8
无符号2B(16bit)整数 \(0 \sim 2^{16}-1\) uint16
无符号4B(32bit)整数 \(0 \sim 2^{32}-1\) uint32
无符号8B(64bit)整数 \(0 \sim 2^{64}-1\) uint64
>> x=uint16(16628) % 无符号2B(16bit)整数

x =

  uint16

   16628

>> isinteger(x) % 验证一个变量是否为整数

ans =

  logical

   1

>> class(x) % 查看数据类型

ans =

    'uint16'

3.1.1.2 浮点数类型

数据类型名称 存储大小 表示范围 类型转换函数
双精度浮点数 8B \(-1.79769 \times 10^{308} \sim +1.79769 \times 10^{308}\) double
单精度浮点数 4B \(-3.40282 \times 10^{38} \sim +3.40282 \times 10^{38}\) single

3.1.1.3 复数类型

z=complex(a,b) % 利用两个实数a、b创建一个复数z,z=a+bi
z=complex(x) % 返回x的等效复数。x为实数,返回x+0i;x为复数,则z与x相同
>> a=12+6i % 直接用赋值语句产生复数

a =

  12.0000 + 6.0000i

>> x=rand(2)*(-3);
>> y=rand(2)*5;
>> z=complex(x,y) % 创建复数,x、y是实数,z是以x为实部、y为虚部的复数

z =

  -2.4442 + 3.1618i  -0.3810 + 1.3925i
  -2.7174 + 0.4877i  -2.7401 + 2.7344i

>> x=rand(2);
>> z=complex(x) % 创建复数,x为实数,z是以x为实部、0为虚部的复数

z =

   0.9575 + 0.0000i   0.1576 + 0.0000i
   0.9649 + 0.0000i   0.9706 + 0.0000i

>> real(z(1)) % 提取复数的实部

ans =

    0.9575

>> imag(z(2,1)) % 提取复数的虚部

ans =

     0

3.1.1.4 Inf和NaN

>> 1000/0

ans =

   Inf % Inf表示正无穷大

>> x=exp(1000)

x =

   Inf

>> x=log(0)

x =

  -Inf % -Inf表示负无穷大

>> 0/0

ans =

   NaN % NaN表示一个既不是实数又不是复数的数值(非数),NaN是Not a Number的缩写。

>> Inf/Inf

ans =

   NaN

3.1.2 逻辑型

L=logical(A) % 将A转换为一个逻辑值数组
>> logical(1)

ans =

  logical

   1

>> logical(0)

ans =

  logical

   0

>> logical(-100)

ans =

  logical

   1

3.1.3 字符型

C=char(A) % 将输入数组A转换为字符数组
C=char(A1,…,An) % 将数组A1,…,An(不要求大小和形状)转换为单个字符数组
>> str='My name is Ding' % 用一对单引号表示字符串

str =

    'My name is Ding'

>> str=char('[781112]') % 用char函数构造一个字符串

str =

    '[781112]'

>> str=char('My  ', 'name', 'is  ', '    ', 'Ding') % 用一对单引号表示字符串

str =

  5×4 char 数组

    'My  '
    'name'
    'is  '
    '    '
    'Ding'

3.1.4 结构体

3.1.4.1 结构体数组的构造

% 通过属性赋值构造一个结构体数组
>> Human.Name='Ding';
>> Human.Score=98;
>> Human.Salary=[9800 10200 8900 8600];
>> Human

Human = 

  包含以下字段的 struct:

      Name: 'Ding'
     Score: 98
    Salary: [9800 10200 8900 8600]

% 下面的语句可以把结构体数组扩展成1*2的结构体数组
>> Human(2).Name='Kitta';
>> Human(2).Score=99;
>> Human(2).Salary=[21000 18000];
>> Human

Human = 

  包含以下字段的 1×2 struct 数组:

    Name
    Score
    Salary
    
>> Human.Name

ans =

    'Ding'


ans =

    'Kitta'

>> Human(2).Name

ans =

    'Kitta'

>> Human(1).Name

ans =

    'Ding'

>> Human.Name

ans =

    'Ding'


ans =

    'Kitta'


ans =

     []

>> Human.Score

ans =

    98


ans =

    99


ans =

     []

>> Human.Salary

ans =

        9800       10200        8900        8600


ans =

       21000       18000


ans =

   96.5000
% 使用函数struct来构造结构体数组
s=struct % 创建不包含任何字段的标量(1*1)结构体
s=struct(field,value) % 创建具有指定字段和值的结构体数组
s=struct(field1,value1,…,fieldN,valueN) % 创建一个包含多个字段的结构体数组
方法 调用格式示例 初始值状况
单独使用struct函数 Personel(3)=struct('Name','John','Score',85.5,'Salary',[4500]) Personel(1)和Personel(2)的属性值都是空矩阵
struct与repmat函数配合使用 repmat(struct('Name','John','Score', 85.5,'Salary',[4500]),1,3) 数组的所有元素都具有和输入一样的值
struct函数的输入为元胞数组 struct('Name',{'Clayton','Dana','John′},'Score',{98.5,100,85.5},'Salary',{[4500],[],[]}) 结构数组的属性值由元胞数组指定

3.1.4.2 访问结构体数组的数据

>> Human=struct('Name',{'Ding','Tina','Tom'},'Score',{98,99,[]},...
'Salary',{[9800 10200 8900 8600],[21000 18000],[]}) % 创建结构体数组

Human = 

  包含以下字段的 1×3 struct 数组:

    Name
    Score
    Salary

>> NewHuman=Human(1:2) % 访问结构体数组的任意子数组,并生成一个1*2的结构体数组

NewHuman = 

  包含以下字段的 1×2 struct 数组:

    Name
    Score
    Salary

>> NewHuman=Human(1:3) % 生成一个1*3的结构体数组

NewHuman = 

  包含以下字段的 1×3 struct 数组:

    Name
    Score
    Salary

>> Human(2).Score % 访问结构体数组的某个元素的某个属性

ans =

    99

>> Human(1).Salary(3) % 访问结构体数组的某个元素的某个属性的元素值

ans =

        8900

>> Human.Name % 得到结构体数组的所有元素的某个属性值

ans =

    'Ding'


ans =

    'Tina'


ans =

    'Tom'

>> Salary=[Human.Salary] % 使用矩阵合并符“[]”合并结果

Salary =

        9800       10200        8900        8600       21000       18000

>> Salary={Human.Salary} % 把结果合并在一个元胞数组里

Salary =

  1×3 cell 数组

    {[9800 10200 8900 8600]}    {[21000 18000]}    {0×0 double}

3.1.5 元胞数组

3.1.5.1 元胞数组的构造

% 左标志法
>> c{1,1}='Butterfly';
>> c{1,2}=@cos;
>> c{2,1}=eye(1,2);
>> c{2,2}=false;

% 右标志法
>> c(1,1)={'Butterfly'};
>> c(1,2)={@cos};
>> c(2,1)={eye(1,2)};
>> c(2,2)={false};

% 简写为下列代码
>> c={'Butterfly',@cos;eye(1,2),false};
>> c={'Butterfly',@cos;eye(1,2),false};
% 方法一:直接输入元胞数组的名称
>> c

c =

  2×2 cell 数组

    {'Butterfly'}    {@cos}
    {[      1 0]}    {[ 0]}

% 方法二:使用函数celldisp显示元胞数组
>> celldisp(c)
 
c{1,1} =
 
Butterfly
 
 
c{2,1} =
 
     1     0

 
 
c{1,2} =
 
    @cos

 
 
c{2,2} =
 
   0

3.1.5.2 元胞数组的读取

>> c={'Butterfly',@cos;eye(1,2),false};
>> Str=c{1,1} % 读取c{1,1}中的字符串

Str =

    'Butterfly'

>> c(1,:) % 读取元胞数组中若干单元的数据,本语句读取元胞数组c的第1行

ans =

  1×2 cell 数组

    {'Butterfly'}    {@cos}

3.1.5.3 元胞数组的删除

>> c={'Butterfly',@cos;eye(1,2),false};
>> c(1,:)=[] % 删除元胞数组c的第一行

c =

  1×2 cell 数组

    {[1 0]}    {[0]}

3.1.6 函数句柄

3.1.6.1 创建函数句柄

fhandle=@myfun;
>> fh=@sin % 创建函数句柄

fh =

  包含以下值的 function_handle:

    @sin

>> fh(0) % fh(0)相当于语句sin(0),计算sin(0)

ans =

     0

>> fh(pi) % 计算sin(π),pi是π的实际值的浮点近似值,因此结果包含数值误差

ans =

   1.2246e-16

>> fh(pi/2) % 计算sin(π/2)

ans =

     1

>> q=integral(fh,0,1) % 利用integral计算sin(x)在区间[0,1]上的积分

q =

    0.4597

3.1.6.2 匿名函数的函数句柄

h=@(arglist)anonymous_function % 定义anonymous_function函数主体,指向匿名函数arglist,输入参数列表以逗号分隔
>> sqr=@(n)n.^2; % 创建一个指向用于计算平方数的匿名函数的句柄sqr
>> x=sqr(3)

x =

     9

>> myfun=@(x,y)(x^2+y^2+x*y); % 带有多个输入的函数
>> x=2; y=8;
>> z=myfun(x,y)

z =

    84

\[试求积分g(c) = \int_0^1 (x^2 + cx + 1) \,\mathrm{d}x。 \]

>> g=@(c)(integral(@(x)(x.^2+c*x+1),0,1)); % 合并使用两个匿名函数
>> g(6)

ans =

    4.3333

3.2 运算符

3.2.1 算术运算符

运算符 用法 功能 补充说明
+ A+B 元素加法或一元运算符正号 表示矩阵A和B对应元素相加,等同于plus(A,B)。A和B必须是具有相同长度的矩阵,除非它们之一为标量。标量可以与任何一个矩阵相加。
- A-B 元素减法或一元运算符负号 表示矩阵A和B对应元素相减,等同于minus(A,B)。A和B必须是具有相同长度的矩阵,除非它们之一为标量。标量可以被任何一个矩阵减去。
.* A.*B 元素相乘 相当于A和B对应的元素相乘,等同于times(A,B)。对于非标量矩阵A和B,矩阵A的列长度必须和矩阵B的行长度一致。一个标量可以与任何一个矩阵相乘。
./ A./B 元素右除法 矩阵A除以矩阵B的对应元素,即A(i,j)/B(i,j),等同于rdivide(A,B)。对于非标量矩阵A和B,矩阵A的列长度必须和矩阵B的行长度一致。
.\ A.\B 元素左除法 矩阵B除以矩阵A的对应元素,即B(i,j)/A(i,j),等同于ldivide(B,A)。对于非标量矩阵A和B,矩阵B的列长度必须和矩阵A的行长度一致。
.^ A.^B 元素的乘方 即[A(i,j)^B(i,j)],对于非标量矩阵A和B,矩阵A的列长度必须和矩阵B的行长度一致。
.' A.' 矩阵转置 当矩阵是复数时,不求矩阵的共轭转置。
* A*B 矩阵乘法 对于非标量矩阵A和B,矩阵A的列长度必须和矩阵B的行长度一致。一个标量可以与任何一个矩阵相乘。
/ B/A 矩阵右除法 粗略地相当于B*inv(A),准确的说相当于(A'\B')'。它是方程X*A=B的解。
\ A\B 矩阵左除法 粗略地相当于inv(A)*B。它是方程A*X=B的解。
^ A^B 矩阵乘方 当A和B都是标量时,表示标量A的B次方幂。当A为方阵、B为正整数时,表示矩阵A的B次乘积;当B为负整数时,表示矩阵A的逆的B次乘积;当B为非整数时,有如下表达式:
A ^ B = \(V * \begin{bmatrix} \lambda_1^B & & \\ & \ddots & \\ & & \lambda_n^B \end{bmatrix} /V\)
其中,\(\lambda_1^B \sim \lambda_n^B\) 为矩阵A的特征值;V为对应的特征向量矩阵。当A为标量,B为方阵时,有如下表达式:
A ^ B = \(V * \begin{bmatrix} A^{\lambda_1} & & \\ & \ddots & \\ & & A^{\lambda_n} \end{bmatrix} /V\)
其中,\(A^{\lambda_1} \sim A^{\lambda_n}\) 为方阵B的特征值;V为对应的特征向量矩阵。当A和B都为矩阵时,此运算无意义。
' A' 矩阵转置 当矩阵是复数时,求矩阵的共轭转置。
>> A=ones(2,3);
>> B=[1 2 3; 4 5 6];
>> X1=A./B % 矩阵A除以矩阵B的对应元素

X1 =

    1.0000    0.5000    0.3333
    0.2500    0.2000    0.1667

>> X2=A.\B % 矩阵B除以矩阵A的对应元素

X2 =

     1     2     3
     4     5     6

>> X3=A/B % 矩阵右除法,也即方程X*B=A的解

X3 =

   -0.3333    0.3333
   -0.3333    0.3333

>> A=magic(4) % 创建4阶魔方矩阵,返回由1到n^2的整数构成的n*n方阵

A =

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

>> 5*A % 矩阵乘法运算

ans =

    80    10    15    65
    25    55    50    40
    45    35    30    60
    20    70    75     5

3.2.2 关系运算符

运算符 名称 示例 使用说明
< 小于 A<B 1. A、B都是标量,结果是为1(真)或为0(假)的标量。
2. A、B若一个为标量,另一个为数组,则标量与数组各元素逐一进行比较,结果为与运算数组行/列相同的数组,其中各元素取值为1或0。
3. 当A、B均为数组时,必须行数、列数分表相同,A与B各对应元素相比较,结果为与A或B行/列相同的数组,其中各元素取值为1或0。
4. ==和~=运算对参与比较的量同时比较其实部和虚部,其他运算只比较实部。
<= 小于或等于 A<=B
> 大于 A>B
>= 大于或等于 A>=B
== 等于 A==B
~= 不等于 A~=B
>> magic(4)>10*ones(4)

ans =

  4×4 logical 数组

   1   0   0   1
   0   1   0   0
   0   0   0   1
   0   1   1   0

3.2.3 逻辑运算符

3.2.3.1 元素方式逻辑运算符

运算符 功能 功能描述 示例
&/and 逻辑与 两个操作数同时为1,运算结果为1;否则为0 A&B/and(A,B)=0 0 0 0 1
|/or 逻辑或 两个操作数同时为0,运算结果为0;否则为1 A|B/or(A,B)=1 1 1 0 1
~/not 逻辑非 当A为0时,运算结果为1;否则为0 ~A/not(A)=0 1 1 1 0
xor 逻辑异或 当两个操作数相同时,运算结果为0;否则为1 xor(A,B)=1 1 1 0 0
>> A=[1 0 0 0 1];
>> B=[0 1 1 0 1];
>> A&B

ans =

  1×5 logical 数组

   0   0   0   0   1

>> and(A,B)

ans =

  1×5 logical 数组

   0   0   0   0   1

>> A|B

ans =

  1×5 logical 数组

   1   1   1   0   1

>> or(A,B)

ans =

  1×5 logical 数组

   1   1   1   0   1

>> ~A

ans =

  1×5 logical 数组

   0   1   1   1   0

>> not(A)

ans =

  1×5 logical 数组

   0   1   1   1   0

>> xor(A,B)

ans =

  1×5 logical 数组

   1   1   1   0   0

3.2.3.2 比特方式逻辑运算符

函数名 功能 功能描述 示例
bitand 返回两个非负整数的对应位做与操作 bitand(A,B)=1(binary 00001)
bitor 返回两个非负整数的对应位做或操作 bitor(A,B)=23(binary 10111)
bitxor 异或 返回两个非负整数的对应位做异或操作 bitxor(A,B)=22 (binary 10110)
bitcmp 补码 返回n位整数表示的补码 bitcmp(A,B)=14(binary 01110)
>> A=17; % 二进制表示为10001
>> B=7; % 二进制表示为00111
>> bitand(A,B)

ans =

     1

>> bitor(A,B)

ans =

    23

>> bitxor(A,B)

ans =

    22

3.2.3.3 短路逻辑运算符

函数名 功能 功能描述 示例
&& 逻辑与 两个操作数同时为1,运算结果为1;否则为0 A&&B
|| 逻辑或 两个操作数同时为0,运算结果为0;否则为1 A||B
>> X=[1 1 0 1 1];
>> Y=[0 0 1 0 0];
>> any(X)||all(Y) % 使用any和all函数将每个向量约简为单个逻辑条件

ans =

  logical

   1

>> b=1;
>> a=20;
>> x=(b~=0)&&(a/b>18.5)

x =

  logical

   1

>> b=0;
>> x=(b~=0)&&(a/b>18.5)

x =

  logical

   0

3.2.4 运算优先级

序号 运算符 优先级
1 括号 最高
 ↓
最低
2 转置(.'),幂(.^),复共轭转置('),矩阵幂(^)
3 一元正号(+),一元负号(-),逻辑非(~)
4 元素相乘(.*),元素右除(./),元素左除(.\),矩阵乘法(*),矩阵右除(/),矩阵左除(\)
5 加法(+),减法(-)
6 冒号运算符(:)
7 小于(<),小于或等于(<=),大于(>),大于或等于(>=),等于(==),不等于(~=)
8 逻辑与(&)
9 逻辑或(|)
10 短路逻辑与(&&)
11 短路逻辑或(||)
>> A=[2 6 8];
>> B=[9 6 3];
>> C=A.*B.^3

C =

        1458        1296         216

>> C=(A.*B).^3 % 调整优先级

C =

        5832       46656       13824

3.3 字符串

3.3.1 字符串的构造

3.3.1.1 创建字符数组

% 函数strcat在合并字符串的同时会把字符串尾部的空格删除。要保留这些空格,可以使用矩阵合并符“[]”实现字符串的合并。
% 在利用函数char创建字符数组时,如果字符串不具有相同的长度,则函数char会自动用空格把字符串补足到最长的字符串的长度。

>> str='helloMATLAB' % 通过一对单引号来表示字符串

str =

    'helloMATLAB'

>> a='hello '; % 字符串后有一空格
>> b='MATLAB';
>> c=strcat(a,b) % 用字符串合并函数strcat得到一个新的字符串

c =

    'helloMATLAB'

>> c=[a b] % 用矩阵合并符实现字符串的合并

c =

    'hello MATLAB'

>> c=char('hello','MATLAB') % 利用函数char来创建字符数组

c =

  2×6 char 数组

    'hello '
    'MATLAB'

3.3.1.2 创建字符串元胞数组

% 利用函数cellstr可以创建字符串元胞数组,创建时会把字符串尾部的空格截取;也可以利用函数char把一个字符串元胞数组转换成一个字符数组

>> data=['hello ';'MATLAB'] % 创建字符数组,带空格

data =

  2×6 char 数组

    'hello '
    'MATLAB'

>> celldata=cellstr(data) % 把上述字符数组转换成字符串元胞数组

celldata =

  2×1 cell 数组

    {'hello' }
    {'MATLAB'}

>> length(celldata{1})

ans =

     5

>> chararray=char(celldata) % 将一个字符串元胞数组转换成一个字符数组

chararray =

  2×6 char 数组

    'hello '
    'MATLAB'

>> length(chararray(1,:)) % 查看第一个字符串的长度

ans =

     6

3.3.2 字符串的比较

3.3.2.1 字符串比较函数

函数 功能描述 基本调用格式
strcmp 比较两字符串是否相等 strcmp(S1,S2) 字符串相等返回1,否则返回0
strncmp 比较两字符串的前N个字符是否相等 strncmp(S1,S2,N) 字符串的前N个字符相等返回1,否则返回0
strcmpi 比较两字符串是否相等,忽略大小写 strcmpi(S1,S2) 字符串相等返回1,否则返回0(忽略大小写)
strncmpi 比较两字符串的前N个字符是否相等,忽略大小写 strncmpi(S1,S2,N) 字符串前N个字符相等返回1,否则返回0(忽略大小写)
>> str1='aaabbb';
>> str2='aaabbc';
>> c=strcmp(str1,str2) % 对字符串进行比较,由于两个字符串不相同,结果为0

c =

  logical

   0

>> c=strncmp(str1,str2,5) % 对字符串的前5个字符相同,因此比较前5个字符返回1

c =

  logical

   1

3.3.2.2 用关系运算符比较字符串

>> str1='aabbcc';
>> str2='abbabc';
>> c=(str1==str2) % 用==运算符判断两个字符串里的对应字符是否相同

c =

  1×6 logical 数组

   1   0   1   0   0   1

% 也可以用其他关系运算符(>、>=、<、<=、==、!=)比较两个字符串。

3.3.3 字符串查找和替换函数

函数名 功能描述 基本调用格式
strrep 字符串查找并替换 str=strrep(str,old,new) 将str中出现的所有old都替换为new
findstr 在字符串内查找(两个输入对等) k=findstr(str1,str2) 在输入的较长字符串中查找较短字符串的位置
strfind 在字符串内查找 k=strfind(str,pattern) 查找str中pattern出现的位置
k=strfind(cellstr,pattern) 查找单元字符串cellstr中pattern出现的位置
strtok 获得第一个分隔符之前的字符串 token=strtok(str) 以空格符(包括空格、制表符和换行符)为分隔符
token=strtok(str,delimiters) 输入delimiters为指定的分隔符
[token,rem]=strtok(...) 返回值rem为第一个分隔符之后的字符串
strmatch 在字符串数组中匹配指定字符串(不推荐) x=strmatch(str,STRS) 在字符串数组STRS中匹配字符串str,返回匹配上的字符串的所在行
x=strmatch(str,STRS,exact) 在字符串数组STRS中匹配字符串str,返回匹配上的字符串的所在行,只有在完全匹配上时,才返回字符串的所在行
>> s1='My name is Ding.'

s1 =

    'My name is Ding.'

>> str=strrep(s1,'Ding','Bin') % 字符串替换

str =

    'My name is Bin.'

>> str='My name is Ding.';
>> index=strfind(str,'i') % 字符串查找

index =

     9    13

>> s='My name is Ding.';
>> [a,b]=strtok(s) % 获取第一个分隔符之前的字符串

a =

    'My'


b =

    ' name is Ding.'

3.3.4 字符串与数值的转换

函数名 功能描述
char 把一个数值截去小数部分,然后转换为等值的字符
int2str 把一个数值的小数部分四舍五入,然后转换为字符串
num2str 把一个数值类型的数据转换为字符串
mat2str 把一个数值类型的数据转换为字符串,返回的结果是MATLAB能识别的格式
dec2hex 把一个正整数转换为十六进制的字符串
dec2bin 把一个正整数转换为二进制的字符串
dec2base 把一个正整数转换为任意进制的字符串
uintN 把字符转换为等值的整数(N为8、16、32、64,如uint8)
str2num 把一个字符串转换为数值类型
str2double 与str2num相似,但比str2num的性能优越,它同时提供对单元字符数组的支持
hex2num 把一个IEEE格式的十六进制字符串转换为数值类型
hex2dec 把一个IEEE格式的十六进制字符串转换为十进制整数
bin2dec 把一个二进制字符串转换为十进制整数
base2dec 把一个任意进制的字符串转换为十进制整数
>> x=rand(1,5)

x =

    0.0975    0.2785    0.5469    0.9575    0.9649

>> disp(['    向量x中的最小值为:' num2str(min(x))])
    向量x中的最小值为:0.09754
posted @ 2026-01-12 08:57  Zhuye_inking  阅读(14)  评论(0)    收藏  举报