第2章基础知识本章着重介绍MATLAB的一些基础知识,包括数据类型、基本矩阵操作、运算符和字符串处理函数。
本章是MATLAB编程的基础。
2.1 数据类型MATLAB中定义了很多种数据类型,包括字符、数值、单元、结构、java类、函数句柄等类型,用户还可以自己定义数据类型。
在MATLAB中有15种基本数据类型,每种基本数据类型均以数组/矩阵的形式出现,该矩阵可以是最小的0*0矩阵到任意大小的n维矩阵。
1.数值类型数值类型包含整数、浮点数和复数3种类型。
另外MATLAB还定义了Inf和NaN两个特殊数值。
(1)整数类型MATLAB支持1、2、4和8字节的有符号整数和无符号整数。
这8种数据类型的名称、表示范围、转换函数如表2-1所示,其中转换函数可以把其它数据类型的数值强制转换为对应的整数类型。
尽可能使用字节少的数据类型,这样可以节约存储空间和提高运算速度。
表2-1 整数类型名称范围转换函数名称范围转换函数有符号1字节整数int8() 无符号1字节整数uint8()有符号2字节整数int16() 无符号2字节整数uint16() 有符号4字节整数int32() 无符号4字节整数uint32() 有符号8字节整数int64() 无符号8字节整数uint64()(2)浮点数类型MATLAB有单精度和双精度两种浮点数,其中双精度浮点数为MATLAB默认的数据类型。
这2种数据类型的名称、存储空间、表示范围和转换函数如表2-2所示。
表2-2 浮点数类型名称存储空间表示范围转换函数单精度浮点数4字节single()双精度浮点数8字节double() (3)复数类型复数包含实部和虚部。
在MATLAB中可以用i或j来表示虚部。
例如:在命令窗口中用赋值语句产生复数5+10i,代码如下:A=5+10i例如:在命令窗口用函数complex()产生复数5+10i,具体代码如下:X=5;Y=10;z=complex(x,y)(4)Inf和NaN在MATLAB中用Inf和-Inf分别表示正无穷大和负无穷大。
除法运算中除数为0或者运算结果溢出都会导致inf或-inf的运行结果。
在MATLAB中用NaN(not a number)来表示一个既不是实数也不是复数的数值。
类似0/0、inf/inf等运算产生的结果均为NaN。
2.逻辑类型在MATLAB中逻辑类型包括true和false,分别由1和0表示。
在MATLAB中用函数logical()将任何非零的数值转换为true(即1),将数值0转换为false(即0)。
3.字符和字符串类型在MATLAB中,数据类型(char)表示一个字符。
一个char类型的1*n数组称为字符串string。
用单引号对表示字符串。
例如:str=‘I am a great person’也可以用char()函数构造字符串。
例如:str=char([65 66])4.结构体类型结构体类型是一种由若干属性(field)组成的MATLAB数组,其中的每个属性可以是任意数据类型。
例如:personel结构体,包括3个属性(Name、Score和Salary),其中Name是一个字符串,Score是一个数值,Salary是一个1*5的向量。
(1)结构体数组的构造构造一个结构体(数组)有如下两种方法。
#利用赋值语句通过赋值语句为结构体中的每个指定属性赋值,从而构造结构体。
例如:建立‘Clayton’、98.5、工资为4500 5100 5600 5200 4800的结构体。
=’Clayton’;Personel.Score=98.5;personel.Salary=[4500 5100 5600 5200 4800];personelpersonel(2).Name=’dana’;personel(2).Score=100;personel(2).Salary=[6700 9000];personel#利用函数struct()在MATLAB中,函数struct()的具体用法如下:StrArray=struct(‘field1’,val1,’field2’,val2,……)例如:Personel=struct(’Name’,{‘Clayton’,’Dana’,’John’},’Score’,{98.5,100,[]},’Salary’,{[450 0 5100 5600 5200 4800],[6700 9000],[]})(2)结构体数组的访问通过结构体数组的下标引用,可以访问任意元素的所有属性,同时可以对属性进行赋值。
2.2 基本矩阵操作在MATLAB中,所有的数据均以二维、三维或高维矩阵的形式存储,每个矩阵的单元可以是数值类型、逻辑类型、字符类型或者其他任何数据类型。
对于标量,可以用1*1矩阵来表示,对于一组n个数据,可以用1*n矩阵来表示;对于多维数组,可以用多维矩阵来表示。
在MATLAB中,可以用whos来显示数据的类型、存储空间等信息。
2.2.1 矩阵的构造1.简单矩阵构造最简单的方法是采用矩阵构造符[]。
构造1*n矩阵(行向量)时,可以将各元素依次放入矩阵构造符[]内,并以空格或者逗号分隔;构造m*n矩阵时,每行如上处理,并且行与行之间用分号分隔。
例如:a=[1 2 3 4] 或者a=[1,2,3,4]例如:b=[1 2 3; 4 5 6] 或者b=[1,2,3;4,5,6]2.特殊矩阵构造在MATLAB中还提供了一些函数用来构造特殊矩阵。
ones(n)或ones(m,n):产生矩阵元素全为1的矩阵。
zeros(n)或zeros(m,n):产生矩阵元素全为0的矩阵。
eye(n):产生单位矩阵,即主对角线上的元素为1,其他元素全为0。
diag(v):将向量转化为对角矩阵。
magic(n):产生魔方矩阵.rand(n)或rand(m,n):产生0~1均匀分布的随机数。
randn(n)或randn(m,n):产生均值为0且方差为1的高斯分布随机数。
randperm(n):产生整数1~n的随机排列。
3.向量构造最简单的方法是采用向量构造符:,其常用的用法如下。
(1)a:b 返回以a为起点,以1为步长,且所有取值在a与b之间的向量。
如果b 值小于a值,则MATLAB返回一个空矩阵。
(2)a:s:b 返回以a为起点,以s为步长,且所有值在a与b之间的向量。
构造向量还可以采用函数linspace()、logspace()等,如函数linspace()用于创建指定范围和步长的等距向量。
例如:a=linspace(-6,6,4)2.2.2 矩阵大小的改变1.矩阵的合并矩阵的合并就是把两个或两个以上的矩阵连接成一个新矩阵。
前面介绍的矩阵构造符[]不仅可以用于构造矩阵,还可以作为一个矩阵合并操作符。
表达式C=[A B]在水平方向合并矩阵A和B,而表达式C=[A;B]在竖直方向合并矩阵A和B。
注意:矩阵合并时要符合维数的约束。
如果水平方向合并,则两个矩阵行数必须相同;如果竖直方向合并,则两个矩阵列数必须相同。
矩阵合并除了使用合并符[]外,还可以使用矩阵合并函数。
矩阵合并函数的描述和基本调用格式如表2-4所示。
表2-4 矩阵合并函数函数名函数描述函数调用格式cat 在指定的方向合并矩阵cat(1,a,b) 与[A;B]一致cat(2,a,b) 与[A B]一致horzcat 在水平方向合并矩阵Horzcat(a,b)vertcat 在竖直方向合并矩阵Vertcat(a,b)repmat 通过复制矩阵来构造新矩阵Repmat(A,M,N)得到m*n块矩阵,其中每块都是A blkdiag 用已知矩阵来构造块对角化矩阵Blkdiag(A,B) 得到以矩阵A和B为对角块的矩阵2.矩阵行列的删除要删除矩阵的某一行或者某一列,只需将该行或该列赋予一个空矩阵[]即可。
例如:A=magic(3);A(2,:)=[];2.2.3 矩阵下标引用通过矩阵下标来存取元素值的方法,包括访问单个元素、先行引用元素和访问多个元素等。
1. 访问单个元素若A是二维矩阵,可以用A(i,j)来表示第i行第j列的元素。
若A是多维矩阵,可以通过指定多个下标来实现对其访问。
2. 线性引用元素对于矩阵A,线性引用元素的格式为A(k)。
通常这样的引用用于行向量或列向量,但也可用于二维矩阵。
Matlab按列优先排列的一个长列向量格式来存储矩阵元素,并不是按其命令行输出格式来存储的。
按照长列向量格式存取元素值就是线性引用元素。
如矩阵A=[2 6 9 ;4 2 8;3 5 1],在内存中是被存储成以2、4、3、6、2、5、9、8、1排列的一个列向量。
它第3行第2列的元素,也就是内存中的第6个元素,其值为5。
要访问这个元素既可以用A(3,2),也可以用A(6)。
一般地,设矩阵A是一个M*N的矩阵,矩阵元素A(i,j)等同于A((j-1)*M+i)。
如上,A(3,2)=A((2-1)*3+3)=A(6)。
3. 访问多个元素操作符:可以用来表示矩阵的多个元素。
若A是二维矩阵,其主要用法如下:A(:,:) 返回矩阵A的所有元素。
A(i,: ) 返回矩阵A的第i行的所有元素。
A(i,k1:k2) 返回矩阵A的第i行的自k1到k2列的所有元素。
A(:,j) 返回矩阵A的第j列的所有元素。
A(k1:k2,j) 返回矩阵A的第j列的自k1到k2行的所有元素。
若A是多维矩阵,也可以通过类似的方法实现对其访问。
操作符:也是向量构造符,可以用它来表示非相邻的多个元素。
例如:读取矩阵A第1,4,7列的元素,其中A=1:8,具体代码如下:A=1:8B=A(1:3:7)2.2.4 矩阵信息的获取矩阵的信息包括矩阵的尺寸、元素的数据类型和矩阵的数据结构等。
1.矩阵的尺寸信息矩阵的尺寸函数可以得到矩阵的形状和大小信息,这些函数如表2-5所示。
表2-5 矩阵尺寸函数函数名函数描述基本调用格式Size 矩阵各方向的长度D=size(x)M=size(x,dim) 返回各方向的长度,以向量方式存储。
返回指定方向的长度Length 矩阵各方向中的最长长度N=length(x) 相当于max(size(x))Ndims 矩阵的维数N=ndims(A) 矩阵的维数Numel 矩阵的元素个数N=numel(A) 矩阵的元素个数2.元素的数据类型查询元素数据类型信息的部分函数如表2-6所示。
函数名函数描述基本调用格式Class 返回输入数据的数据类型Isa 判段输入数据是否是指定数据类型Ischar 判断输入数据是否为字符串Isfloat 判断输入数据是否为浮点数Isinteger 判断输入数据是否为整数Islogical 判断输入数据是否为逻辑型Isnumeric 判断输入数据是否为数值型Isreal 判断输入数据是否为实数Isstruct 判断输入数据是否为结构体3.矩阵的数据结构判断矩阵是否为某种指定数据结构的函数如表2-7所示。