
2.1 变量及其操作
一、变量命名规则
1.变量名、函数名对字母大小写是敏感的
myfile与MyFile表示不同的变量
sin是MATLAB定义的正弦函数名,但SIN、Sin都不是
2.变量名的第一个字符必须是英文字母
3.变量名最多可包含63个字符(英文、数字和下划线)
4.变量名中不能包含空格、标点
my_exemple12是合法的变量名,12exemple、_exemple12、my exemple12、my.exemple12是非法变量名
二、MATLAB默认的预定义变量
每当MATLAB启动时,不经定义和赋值就会产生一些变量,称为MATLAB默认的预定义变量
这些变量都可以重新赋值。但最好不要对这些变量名重新赋值
| 预定义变量 | 含义 | 预定义变量 | 含义 |
| ans | 计算结果的缺省变量名 | nargin | 函数输入参数个数 |
| eps | 机器零阈值(机器的浮点运算误差限) | narout | 函数输出参数个数 |
| Inf或inf | 无穷大,如1/0 | realmax | 最大正浮点数 |
| i或j | 虚数单位 | realmin | 最小正浮点数 |
| pi | 圆周率π | lasterr | 存放最新的错误信息 |
| NaN或nan | 不是一个数(Not a Number),如0/0,∞/∞ | lastwarn | 存放最新的警告信息 |
eps
eps —— 机器的浮点运算误差限。PC机上eps的默认值为 2.2204×10-16 ,若某个量的绝对值小于eps,则可以认为这个量为0。
例2 用键盘在MATLAB指令窗中输入以下内容
1/0,1.e1000,log(0)
Inf —— 无穷大量 + ∞ 的MATLAB表示,也可以写成inf 。同样地,- ∞ 可以表示为 - Inf 。在 MATLAB 程序执行时,即使遇到了以 0 为除数的运算,也不会终止程序的运行,而只给出一个“除0”警告,并将结果赋成Inf ,这样的定义方式符合 IEEE 的标准。从数值运算编程角度看,这样的实现形式明显优于C语言。
例3 用键盘在MATLAB指令窗中输入以下内容
0/0,inf/inf,inf*0
注意
在MATLAB中,即使遇到以0为除数的运算,程序也不会终止运行。这时只给出一个警告,并将结果赋给inf或NaN
NaN —— 不定式( not a number ) ,通常由 0 / 0 运算、Inf / Inf 及其他可能的运算得出。 NaN 是一个很奇特的量,如 NaN 与Inf 的乘积仍为 NaN 。
例4 用键盘在MATLAB指令窗中输入以下内容
n= realmax,n= 1.7977e+309
例5 用键盘在MATLAB指令窗中输入以下内容
m= realmin,m=2.2251e-309
i 和 j —— 若i或j量不被改写,则它们表示纯虚数量j 。但在 MATLAB 程序编写过程中经常事先改写这两个变量的值,比如在循环过程中常用这两个变量来表示循环变量。如果想恢复该变量,则可以用语句 i = sqrt(-1)设置,即对 -1 求平方根。
三、MATLAB运算符和表达式
运算符
| 操作 | 数学表达式 | MATLAB运算符 | MATLAB表达式 |
| 加 | a+b | + | a+b |
| 减 | a-b | - | a-b |
| 乘 | a b | * | a*b |
| 除 | a b | /或\ | a/b或b\a |
| 幂 | ab | ^ | a^b |
所有运算都定义在复数域上
例1 用键盘在MATLAB指令窗中输入以下内容
u=sqrt(-4)
注意
对于方根,运算只给出处于第1象限的解
例2 用左除(\\)和右除(/)计算表达式的值
用键盘在MATLAB指令窗中输入以下内容
(5+cos(47*pi/180))/(1+sqrt(7)-2*i)、(1+sqrt(7)-2*i) \(5+cos(180 \\47*pi))
注意
对于标量,左除(\\)或右除(/)所得到的结果是一样的
对于矩阵,左除(\\)和右除(/)所得到的结果是不一样的
AX=B → A-1AX= A-1B → X=A-1B=A\\B,
XA=B → XA A-1=B A-1 →X= BA-1= B/A
表达式
表达式由变量名、运算符、函数名组成
表达式按优先级和自左向右的顺序运算
优先级从高向低的排序是:指数运算、乘除运算、加减运算
括号可以改变运算的顺序
赋值符“=”和运算符的两侧允许有空格
复数和复数矩阵
MATLAB把复数看成一个整体来处理(不像其它程序,把实部和虚部分开处理)
虚数单位用预定义变量i或j表示
复数z=a+bi=reiθ直角坐标表示与极坐标表示之间的转换
real(z):给出复数z的实部a=rcosθ
imag(z):给出复数z的虚部b=rsinθ
abs(z):给出复数z的模r=sqrt(a2+b2)
angle(z):以弧度为单位给出复数z的相角θ=arctg(b/a)
例1 写出复数表达式,计算
用键盘在MATLAB指令窗中输入以下内容
z1= 3 + 4i %书写格式1
z2 = 1 + 2 * i %书写格式2
z3=2*exp(i*pi/6) %书写格式2
z=z1*z2/z3
注意
%是注释号,在它后面及回车之前的输入部分是非执行的注释
在格式1中,4i表示一个完整的虚数,4和i之间不能有空格
在格式2中,i被看作一个预定义变量参与运算
格式1的运算速度要比格式2快,宜于在循环中采用
例2 复数矩阵的生成及运算
用键盘在MATLAB指令窗中输入以下内容
A=[1,3;2,4]-[5,8;6,9]i
A=[1,3;2,4]-[5,8;6,9]*i
B=[1+5i,2+6i;3+8*i,4+9*i]
C=A*B
注意
格式1仅用于复数标量的表达,不能表达复数矩阵
例3 求上例复数矩阵C的实部、虚部、模和相角
用键盘在MATLAB指令窗中输入以下内容
C_real=real(C)
C_imag=imag(C)
C_magnitude=abs(C)
C_phase=angle(C)*180/pi %以度为单位计算相角
四、MATLAB的数据结构
数据型、符号型、字符串型、数组、单元数组、类
数据型:可以单独输入,也可以赋值给数值变量
符号型:可用于公式推导,得到数学问题解析解
字符串型:C语言中字符串是用双引号括起来的,而MATLAB字符串是用单引号括起来的
1.数据型:
双精度浮点数,占8字节(位),指数11位,尾数53位,符号1位。
在一般情况下,数据的存储和计算都是以双精度进行的。
但是,可以用format命令改变数据在屏幕上的显示格式
| 指令 | 含义 |
| format format short | 通常保证小数点后4位有效数字;对于大于1000的实数,用5位有效数字的科学记数形式显示 |
| format long | 15位数字表示 |
| format short e | 5位科学记数表示 |
| format long e | 15位科学记数表示 |
| format short g | 从format short和format short e中自动选择最佳记数方式(缺省设置) |
| format long g | 从format long和format long e中自动选择最佳记数方式 |
| format rat | 近似有理数表示 |
| format hex | 16进制表示 |
| format bank | (金融)元、角、分表示 |
| format + | 正数、负数和零分别用+、-和空格表示 |
输入:format(或format short) 回车
输入:pi 回车
例2:用format和format short格式显示1000π的数值
输入:format(或format short) 回车
输入:1000*pi 回车
例3:分别用format long、format short e、format long e、format short g、format long g、format rat和format bank格式显示π的数值
例4:用format +格式分别显示π、π-2π和π-π的数值
五、MATLAB常用函数
三角函数
| 函数名称 | 数学表达 | MATLAB表达 |
| 正弦 | sin | sin |
| 反正弦 | arcsin | asin |
| 余弦 | cos | cos |
| 反余弦 | arccos | acos |
| 正切 | tg | tan |
| 反正切 | arctg | atan |
| 余切 | ctg | cot |
| 反余切 | arcctg | acot |
| 正割 | sec | sec |
| 反正割 | arcsec | asec |
| 余割 | csc | csc |
| 反余割 | arccsc | acsc |
| 函数名称 | 数学表达 | MATLAB表达 |
| 双曲正弦 | sh | sinh |
| 反双曲正弦 | Arsh | asinh |
| 双曲余弦 | ch | cosh |
| 反双曲余弦 | Arch | acosh |
| 双曲正切 | th | tan |
| 反双曲正切 | Arth | atan |
| 双曲余切 | cth | coth |
| 反双曲余切 | Arcth | acoth |
| 双曲正割 | sech | sech |
| 反双曲正割 | Arsech | asech |
| 双曲余割 | csch | csch |
| 反双曲余割 | Arcsch | acsch |
| 函数名称 | 数学表达 | MATLAB表达 |
| 自然指数函数 | ex | exp(x) |
| 自然对数函数 | ln | log |
| 常用对数函数 | log10 | log10 |
| 以2为底的对数函数 | log2 | log2 |
| 2的幂函数 | 2x | pow2(x) |
| 平方根函数 | x1/2 | sqrt(x) |
| MATLAB表达 | 含义 | MATLAB表达 | 含义 | MATLAB表达 | 含义 |
| abs | 模,或绝对值 | conj | 复数共轭 | real | 复数实部 |
| angle | 相角(弧度) | imag | 复数虚部 |
输入:abs(-pi)
圆整函数和求余函数
| 函数名称 | MATLAB表达 | 含义 | 例 |
| 向+∞圆整函数(天花板函数) | ceil | 不小于自变量的最小整数 | ceil(π)=? ceil(-π)=? |
| 向0圆整函数 | fix | 向0方向取整数 | fix(π)=? fix(-π)=? |
| 向-∞圆整函数(地板函数) | floor | 不大于自变量的最大整数 | floor(π)=? floor(-π)=? |
| 模除求余函数 | mod(x,y) | y不等于0时,mod(x,y)=x- y*floor(x/y); y=0时,mod(x,y)=x | |
| 求余数函数 | rem(x,y) | y不等于0时,rem(x,y)=x- y*fix(x/y); y=0时,rem(x,y)=NaN | |
| 向最近整数圆整函数 | round | 四舍五入到最邻近的整数 | round(π)=?, round(-π)=?, round(6.5)=? |
| 符号函数 | sign | x<0,sign(x)=-1;x=0,sign(x)=0;x>0,sign(x)=1 |
1.若a为正整数,ceil, fix, floor, round函数之间的区别如图
2.对于模除求余函数mod(x,y)和求余数函数rem(x,y),
y=rem(13,3)=1
y=mod(13,3) = 1
y=rem(-13,-3) = -1
y=mod(-13,-3) = -1
y=rem(-13,3) = -1
y=mod(-13,3) = 2
y=rem(13,-3) = 1
y=mod(13,-3) = -2
rem(x,y)的符号与x相同,mod(x,y)的符号与y相同
当x、y的符号相同时,rem(x,y)=mod(x,y)
例1:当x=5,y=3,求rem(x,y)和mod(x,y)
1.先输入:x-y*fix(x/y),再输入rem(x,y),比较结果
2.先输入:x-y*floor(x/y),再输入mod(x,y),比较结果
例2:当x=-5,y=3,求rem(x,y)和mod(x,y)
rem
Purpose Remainder after division
Syntax R = rem(X,Y)
如果Y ~= 0, R = rem(X,Y) 给出 X - n.*Y,这里n = fix(X./Y).
如果Y不是一个整数,而且商X./Y 是在一个整数的四舍五入的误差内, 那么n就是那个整数。根据惯例, rem(X,0)是NaN。输入X and Y 必须是相同维数的实矩阵, 或实标量。
只要X和Y同号, rem(X,Y)给出和mod(X,Y)一样的结果。但是, 对于正的X和Y, rem(-X,Y) = mod(-X,Y)-Y
Rem函数给出一个在0和sign(X)*abs(Y)之间的结果。如果Y为0, rem给出NaN。
mod
Purpose Modulus after division
Syntax M = mod(X,Y)
Definition mod(x,y) is x mod y.
如果Y ~= 0, M = mod(X,Y)给出X - n.*Y,这里n = floor(X./Y) .
如果Y不是一个整数,而且商X./Y 是在一个整数的四舍五入的误差内, 那么n就是那个整数。根据惯例, mod(X,0)是X.。输入X and Y 必须是相同维数的实矩阵, 或实标量。
只要X和Y同号,, 函数mod(X,Y) 给出和rem(X,Y) 一样的结果。但是, 对于正的X和Y,mod(-X,Y) = rem(-X,Y)+Y
mod函数对于同余关系是有用的:
当且仅当mod(x,m) == mod(y,m),X和y是同余的(congruent被一个模数所分成的差额) (mod m).
例3:当x1 = -pi,x2 = 0,x3 = pi时,求sign(x1),sign(x2),sign(x3)
2.2 数值数组及其运算
由MATLAB软件构成的“矩阵”在外观形状和数据结构上与数学意义上的矩阵是及其相似的
但MATLAB中的矩阵在操作上具有二重性
既可以按数学中的矩阵运算规则操作
又可以按照MATLAB软件自己定义的规则操作
具有这样特性的“矩阵”—数组
按MATLAB软件自己定义的规则进行的运算—数组运算
数组可分为1维、2维、3维,甚至更数
一、一维数组(矩阵)的创建
1.逐个元素输入法
例:输入
x=[2 pi/2 sqrt(3) 3+5i]
2.冒号生成法
通过设定步长生成一维数组
x=a:inc:b
a是数组的第1个元素。inc是采样点之间的间隔,即步长。
如果(b-a)是步长inc的整数倍,则生成的数组的最后一个元素是b
如果(b-a)不是步长inc的整数倍,则生成的数组的最后一个元素小于b
a、inc、b之间必须用冒号“:”分隔
例1:取步长为0.2,在[0,π]区间生成一个1维数组
输入:x1=0:0.2:pi %注意最后一个生成元素是不是π
输入:x1(5) % 显示数组x1的第5个元素
inc可以省略。省略时,inc默认为1
例2:取步长为1,在[0,π]区间生成一个1维数组
输入:x2=0:pi
步长inc可以是正数,也可以是负数
当步长inc取正数时,要保证a当步长inc取负数时,要保证a>b
例3:取步长为1,在[0,π]区间逆向生成一个1维数组
输入:x3=pi:-1:0 %注意比较本例与例1中数组的第1个元素
输入:x3=0:-1:pi %注意结果
例4:取步长为0.1,在[0,2π]区间画出正弦曲线
输入:x4=0:0.1:2*pi; %在[0,2π]区间生成一个1维数组
输入:y=sin(x4); %建立正弦函数
输入:plot (x4, y) %画出y-x曲线
3.定数线性采样法
在给定的总点数下,均匀采样生成一维数组
x=linspace(a,b,n)
a和b分别是数组的第1个和最后一个元素,n是采样总点数(包括a和b)
步长=(b-a)/(n-1)
相当于x=a: (b-a)/(n-1):b
例3:在[0,π]区间生成具有16个均匀采样点的一维数组
输入:x4=linspace(0,pi,16) %注意最后一个元素是不是π
4.定数对数采样法
在给定的总点数下,通过常用对数采样生成一维数组
x=logspace(a,b,n)
数组的第1个元素是10a,最后一个元素是10b。n是采样总点数(包括a和b)。步长=10(b-a)/(n-1)
例:输入:logspace(1,6,6)
二、二维数组(矩阵)
特点:具有行和列
例:A=[1:3;4:6;7:9] % 3×3数组(矩阵)
二维数组(矩阵)元素的标识
“全下标”标识
“单下标”标识
例:产生一个5阶的魔方数组,并显示全下标第2行第4列的元素和单下标第14个元素
输入:D=magic(5) % magic为MATLAB提供的魔方数组(矩阵)函数
输入:D(2,4), D(14)
三、数组运算和矩阵运算
加减运算
设两个行数和列数相同矩阵A=(aij)m n和B=(bij)m n。
它们相加和相减,分别得到新的矩阵A+B和A-B。
它们的行数和列数与原来的矩阵相同,
新的矩阵的元素等于原来矩阵的元素的相加或相减
A+B=( aij n+bij)m n,A-B=( aij-bij)m n。
MATLAB软件构成的数组(“矩阵”)可以实现矩阵的加减运算
例 设,,求,
输入:A=[1,-2;0,1;-1,3], B=[0,2;-1,1;2,5]
输入:C=A+B, D=A-B
注意:
对于数学意义上的矩阵来说,只有两个矩阵的行数和列数相同时,才能进行加减运算
对于非一行一列的矩阵,不能与标量相加减
但是,对于MATLAB软件来说,允许数组(“矩阵”)与标量相加减,这时就是数组加减运算。
数组与标量相加或相减,相当于数组中的每个元素与标量相加或相减
设s为一个标量,A=(aij)m n为一个非一行一列的矩阵,那么
s+A生成与A同行同列的数组
而且新数组的每一元素等于原来元素与标量之和
s+A=( s+aij)m n
s-A或A-s也生成与A同行同列的数组
s-A=( s-aij)m n,A-s=(aij-s)m n
例 s=3,求E=s+A, F=s-A, G=A-s
乘法运算
在数学上,两个矩阵相乘,第一个矩阵的列数必须等于第二个矩阵的行数,
设A=(aij)m t,B=(bij)t n,它们相乘生成新矩阵C=AB
新矩阵的行数等于第一个矩阵的行数,新矩阵的列数等于第二个矩阵的列行数,C=(cij)m n。
新矩阵的元素按下面规则构成:
在MATLAB中,可以实现这种运算,C=A*B。
例 设,,求
输入:A1=[3,-2;1,0;-1,-3], B1=[1,2,0,4;5,-2,-1,0]
输入:C1=A1*B1
此外,在MATLAB中,还可以实现下面的乘积运算,这在数学上没有定义
设A=(aij)m n,B=(bij)m n,它们的行数和列数相同,
那么A.*B生成一个新的数组,其行数和列数与原来数组相同,新数组的元素等于原来数组相应元素的乘积,称为数组乘积运算。
A.*B=(aij bij)m n
例 设,,求,
输入:A=[1,-2;0,1;-1,3], B=[0,2;-1,1;2,5]
输入:C=A.*B
在数学上,一个标量与矩阵的乘积对于矩阵的每个元素与这个标量的乘积
sA=(saij)m n
在MATLAB中,可以实现这种运算,C=s*A。
此外,s.*A也给出同样的结果
例 求C=s*A,D=s.*A
除法运算
对于矩阵,分左除(\\)和右除(/)两种,而且所得到的结果是不一样的
AX=B → A-1AX= A-1B → X=A-1B=A\\B,
XA=B → XA A-1=B A-1 →X= BA-1= B/A
此外,在MATLAB中,还可以实现一种数组除法运算
设A=(aij)m n,B=(bij)m n,它们的行数和列数相同
B./A或A.\\B给出与原数组行和列相同的数组
而且它们的结果都是一样的,等于两个数组相应元素的分别相除
B. / A ( A. \ B ) = ( bij / aij ) m n
例 设,,求,,
在MATLAB中,还可以实现一种标量除以数组的运算
s. / A ( A. \ s )= (s / aij) m n
转置
设A=(aij)m n
在数学上,表示矩阵的共轭转置
在MATLAB中,矩阵的共轭转置仍然用A’表示
此外,在MATLAB中,还可以实现下面的数组转置
A.’=(aji)n m,为非共轭转置
它与矩阵的共轭转置的关系为:A.’=conj(A’)
例 设z = [1+2i 3+4i],求z’及z.’
四、数组的关系和逻辑运算
关系(比较)运算
关系运算符
| 指令 | 含义 |
| < | 小于 |
| <= | 小于等于 |
| > | 大于 |
| >= | 大于等于 |
| == | 等于 |
| ~= | 不等于 |
1.等式成立时,表示逻辑真,输出为1
等式不成立时,表示逻辑假,输出为0
2.当两个非标量数组进行比较时
两个数组的维数必须相同
比较是在两个数组的对应元素之间进行
比较的结果是与原来维数相同的数组
3.标量可以与非标量数组进行比较
比较是在标量和数组的每一个元素之间进行
比较的结果是与非标量数组维数相同的数组
例 设A=1:9,B=10-A,求r0=(A<4),r1=(A==B), r2=(A~=B)
逻辑运算
| 指令 | 函数 | 含义 |
| A&B | and(A,B) | 与 |
| A|B | or(A,B) | 或 |
| ~A | not(A) | 非 |
1.等式成立时,表示逻辑真,输出为1
等式不成立时,表示逻辑假,输出为0
2.当两个非标量数组进行逻辑运算时
两个数组的维数必须相同
逻辑运算是在两个数组的对应元素之间进行
逻辑运算的结果是与原来维数相同的数组
3.标量可以与非标量数组进行比较
逻辑运算是在标量和数组的每一个元素之间进行
逻辑运算的结果是与非标量数组维数相同的数组
例1 设A=[0,1,1,0,1], B=[1,1,0,0,1],求A&B, A|B, ~A
注意
对数组或标量进行逻辑运算时,非零数当做逻辑1处理
例2 将上例的A分别改为A=[0,3.5,1,0,1]、A=[0,0.5,1,0,1],求A&B, A|B, ~A
注意
逻辑运算的优先级从高到低排序是:~、&、|
例3 设A=[0,1,1,0,1], B=[1,1,0,0,1],C=[0,1,0,1,0],求~A|B, A|~B和A&B|C, A|B&C
注意
在关系运算和逻辑运算同时存在时,逻辑非优先,关系运算次之,其次是逻辑与,逻辑或排在最后
例3 设A=-3:3,求L1=~(A>0),L2=~A>0,L3=~A ,L4=A>-2&A<1
先决逻辑运算
先决逻辑运算用于逻辑表达式的运算
与数组逻辑运算不同,只有运算量是标量时,先决逻辑运算才有意义
先决与&&、先决或||
先决与:(expression 1)&&(expression 2)
当(expression 1)=1时
再对(expression 2)进行逻辑运算
然后对(expression 1)与(expression 2)执行“与”运算
当(expression 1)=0时
不再对(expression 2)进行逻辑运算
立即给出“逻辑假”的结果
例1 设a=6, 当b=0, b=2, b=1时,分别判断(b~=0)&&(a/b>5)
注意
乘除运算优先于关系运算
例2 设a=6, 当b=0时,判断(b==0)&&(a/b>5)
先决或:(expression 1)||(expression 2)
当(expression 1)=0时
再对(expression 2)进行逻辑运算
然后对(expression 1)与(expression 2)执行“或”运算
当(expression 1)=1时
不再对(expression 2)进行逻辑运算
立即给出“逻辑真”的结果
例3 设a=6, 当b=0, b=1, b=-1时,分别判断(b==0)||(a/b>0)
注意
先决与&&优先于先决或||,它们排在其它运算之后
例4 设a=6,b=-2, 判断 (b~=0)|| (a/b>0)&&(a/b>5)
关系与逻辑函数
| 函数名 | 功能 |
| xor(A,B) | ,异或运算“exclusive or”。当两个数组对应元素同为0或同为非0,相应元素取0,否则取1 |
| any(A) | 如果A是向量(一维数组),只要向量中有一个元素不为0,结果为1,否则为0 如果A是矩阵(二维数组),any(A)把每一列元素作为向量处理,给出对多个向量判断的结果 |
| all(A) | 如果A是向量(一维数组),向量中所有元素不为0时,结果为1;否则为0 如果A是矩阵(二维数组),any(A)把每一列元素作为向量处理,给出对多个向量判断的结果 |
注意,eps虽然显示为0,实际上是非0
例2 A = [1,2,3;4,5,6;7,8,0],求B=any(A)、C=any(A>=5)
例3 A = [1,2,0;4,5,0;7,8,0],求B=any(A)
例4 A = [1,2,3;4,5,6;7,8,0],求B=all(A)、C=all(A>=5)
例4 A = [1,2,3;4,5,6;7,8,9],求B=all(A)
五、数组(矩阵)操作技巧
1.测试函数find
设A是一数组,k = find(A)
给出数组A非0元素的单下标。
如果数组没有非0元素,则给出一个空矩阵
例1 设A = [11 0 33 0 55],求find(A)、find(A == 0)、find(0 < A& A < 10*pi)
例2 设A = [11 0 33 0 55]’,求find(A)
例3 设A = [1,2,3;4,5,6;7,8,0],求find(A>5)
设A是一数组,[n,m] = find(A)
给出数组A非0元素的全下标
例4 设M = magic(3),求[n,m] = find(M>7)
2.数组大小的判别
对于简单的数组,可以通过观察来判别它的维数和每一维的长度
对于复杂的数组,要通过size命令或length命令观察来判别它的维数和每一维的长度
size
d = size(A) 给出数组A每一维的长度
例1 设A=[0:0.2:pi;0:0.4:2*pi],求size(A)
[m,n] = size(A) 以变量m和n分别给出A每一维的长度
例2 设A=[0:0.2:pi;0:0.4:2*pi],求[m,n] = size(A)
length(A) 给出数组A中所有维的最大长度
即:length(A)= max(size(A))
例3 设A=[0:0.2:pi;0:0.4:2*pi],求length(A)
3.数组操作函数
reshape
在数组总元素数不变得前提下,改变各维的大小
B = reshape(A,m,n)
从数组A按列取出元素构成m行n列数组B
例3 设A=[1, 4, 7, 10; 2, 5, 8, 11; 3, 6, 9, 12],求B = reshape(A,2,6)
B = reshape(A,m,n..,[],...)
这里,占位符[]表示一个未明确显示的维的长度,它和其余维的长度乘积等于数组A各维长度的乘积
例4 设A=[1, 4, 7, 10; 2, 5, 8, 11; 3, 6, 9, 12],求B = reshape(A,2,[]),C = reshape(A,1,[]),D = reshape(A,4,[]),E = reshape(A,2,3,[])
repmat
按指定维的数目铺放模块数组
B = repmat(A,m,n)或B = repmat(A,[m n])
将数组A作为整体按m行n列堆放
例5将eye(2) 作为整体按3行4列堆放
输入:B = repmat(eye(2),3,4)
4.数组的寻访与赋值
一维数组的寻访与赋值
例1 设x=[0.9501, 0.2311, 0.6068, 0.4860, 0.13],求x(3),x([1 2 5]),x(1:3),x(3:end),x(3:-1:1),x(find(x>0.5)),x([1 2 3 4 4 3 2 1])
注意
end是一维数组的长度,即最大下标
寻访什么样的子数组,取决于数组x(index)中的下标index
下标index可以是单个正整数或正整数数组,但index中的每个元素的取值必须在闭区间[1,end]内
例2,将上例的x数组的第3个元素重新赋值为0
x(3)=0
例3,将当前的x数组的第1和第4个元素重新赋值为1
x([1 4])=[1 1]
二维数组的寻访与赋值
A(r,c),由A的“r指定行”和“c指定列”上的元素组成
例1 设A=[1, 4, 7, 10; 2, 5, 8, 11; 3, 6, 9, 12],求A(2,3)
例2 设A=[1, 4, 7, 10; 2, 5, 8, 11; 3, 6, 9, 12],求A([2,3],[1,3]),A([2,3],3)
注意,方括号的作用
设数组Sa的行宽和列长与A(r,c) 的行宽和列长相同
则可以以双下标方式将Sa赋值给A(r,c),A(r,c)=Sa
例3 设A=[1, 4, 7, 10; 2, 5, 8, 11; 3, 6, 9, 12],Sa=[20,30;40,50],求A([2,3],[1,3])=Sa
A(r,:),由A的“r指定行”和“全部列”上的元素组成
例2 设A=[1, 4, 7, 10; 2, 5, 8, 11; 3, 6, 9, 12],求A(2,:),A([2 3],:)
A(:,c),由A的“全部行”和“c指定列”上的元素组成
例3 设A=[1, 4, 7, 10; 2, 5, 8, 11; 3, 6, 9, 12],求A(:,3),A(:,[2 4])
例3 设A=[1, 4, 7, 10; 2, 5, 8, 11; 3, 6, 9, 12],求A(:,[2 4 1])=ones(3)
左右两边的数组的行宽和列长必须相同
A(q),“单下标寻访”,由A的列按自左向右、首尾相接排序
例4 设A=[1, 4, 7, 10; 2, 5, 8, 11; 3, 6, 9, 12],求A(7)
A(:),“单下标全元素”寻访,由A的各列按自左向右、首尾相接生成“一维长列”
例5 设A=[1, 4, 7, 10; 2, 5, 8, 11; 3, 6, 9, 12],求A(:)
设s是数组,而且它的元素是从数组A的单下标中选取
A(s),“单下标寻访”,生成由“s”指定的数组
并且数组A(s)的维数与长度与数组s相同
例6 设s=[2 3 5],B=[16,2,3,13;5,11,10,8;9,7,6,12],求B(s)
例7 设t=[7 5;9 2],B=[16,2,3,13;5,11,10,8;9,7,6,12],求B(t)
设L是逻辑数组(其元素为1或0),且与数组A的维数和长度相同
A(L)给出逻辑数组L中由“1”元素选出A的对应元素,并按单下标次序排成列
例8 A=zeros(2,5); A(:)=-4:5,L=abs(A)>3,求X=A(L)
2.3 符号对象
2. 3.1 建立符号对象
MATLAB除了具有数值计算功能外,还具有符号计算功能。
MATLAB提供了一种符号数据类型,这种数据类型是用sym或syms函数定义的,相应的定义对象称为符号对象。
MATLAB提供的两个建立符号对象的函数sym和syms的用法不同。
1.建立符号变量和符号常量
(1) sym函数
sym函数用来建立单个符号量,一般调用格式为:
符号量名=sym('符号字符串')
该函数可以建立一个符号量,符号字符串可以是常量、变量、函数或表达式。
a=sym('a')将建立符号变量,它与非符号变量是不同的。
非符号变量在参与运算前是需要赋值的。变量的运算实际上是针对所赋的值运算,运算的结果是与变量类型对应的值。而对于符号变量,在运算前不需要赋值,其运算结果是一个表达式。
例1 a=sym('a'); b= sym('b'); c= sym('c'); %定义符号变量a、b、c
x=5; y=-6; z=11; %定义数值变量x、y、z
w=a*a+b*b+c*c %符号运算
w=x*x+y*y+z*z %数值运算
whos %查看内存变量
这里,w开始是符号变量,重新赋值后,成为数值变量。
应用sym函数还可以定义符号常量,使用符号常量进行代数运算时和数值常量进行的运算不同。
下面的例子用于比较符号常量与数值常量在代数运算时的差别。
例2
pi1= sym('pi'); k1= sym('8'); k2= sym('3'); %定义符号常量
pi2= pi; r1= 8; r2= 3; %定义数值常量
sin(pi1/3) %符号计算
sin(pi2/3) %数值计算
sqrt(k1+sqrt(k2)) %符号计算
sqrt(r1+sqrt(r2)) %数值计算
用符号常量计算所得到的结果是精确的数学表达式
而数值计算的结果往往是近似的有限小数
(2) syms函数
函数sym一次只能定义一个符号变量,使用不方便。MATLAB提供了另一个函数syms,一次可以定义多个符号变量。syms函数的一般调用格式为:
syms 符号变量名1 符号变量名2 … 符号变量名n
用这种格式定义符号变量时不要在变量名上加字符串分界符(‘),变量之间用空格而不要用逗号分隔。
例 用syms函数定义符号变量a、b、c、d
syms a b c d
whos %查看内存变量
例3 a=sym('a'); b= sym('b'); c= sym('c'); %定义符号变量a、b、c
x=5; y=-6; z=11; %定义数值变量x、y、z
w=a*a+b*b+c*c %符号运算
w=x*x+y*y+z*z %数值运算
whos %查看内存变量
这里,w开始是符号变量,重新赋值后,成为数值变量。
应用sym函数还可以定义符号常量,使用符号常量进行代数运算时和数值常量进行的运算不同。
下面的例子用于比较符号常量与数值常量在代数运算时的差别。
2.建立符号表达式
含有符号对象的表达式称为符号表达式。
建立符号表达式有以下3种方法:
(1)利用单引号来生成符号表达式。
例1 y= '1/sqrt(2*x)' %生成一般的符号表达式
f= 'cos(x^2)-sin(2*x)=0' %生成符号方程
(2)用sym函数建立符号表达式。
例2 U= sym('3*x^2-5*y+2*x*y+6') %建立符号表达式“3*x^2-5*y+2*x*y+6”
M=sym('[a, b; c,d]') %生成符号矩阵
(3) 使用已经定义的符号变量组成符号表达式。
例3 syms x y
V=3*x^2-5*y+2*x*y+6
2. 3.2 符号表达式运算
1.符号表达式的四则运算
符号表达式的加、减、乘、除运算可分别由函数symadd、symsub、symmul和symdiv来实现,幂运算可以由sympow来实现。
运算结果仍然是符号表达式
例1 f='2*x^2+3*x-5' %定义符号表达式
g='x^2-x+7'
symadd(f,g) %求f+g
symsub(f,g) %求f-g
symmul(f,g) %求F*g
symdiv(f,g) %求f/g
sympow(f, '3*x') %求f^(3x)
此外,也可以用+、-、*、/、^运算实现符号运算
例2 syms x y z;
f=2*x+x^2*x-5*x+x^3+exp(2)
f=2*x/(5*x)
f=(x*x-y*y)/(x-y)
2.符号表达式的提取分子和分母运算
如果符号表达式是一个有理分式或可以展开为有理分式,可利用numden函数来提取符号表达式中的分子或分母。其一般调用格式为:
[n,d]=numden(s)
该函数提取符号表达式s的分子和分母,分别将它们存放在n与d中。
例1 a=sym(0.333) %数字加与不加单引号结果一样,都是符号常量
[n, d]=numden(a)
numden函数是在符号表达式有理化后提取分子和分母
例2 g=sym('(x^2+3)/(2*x-1)+3*x/(x-1)')
[n, d]=numden(g)
如果符号表达式s是一个符号数组,[n,d]=numden(s)函数给出两个新数组n和d。其中n是分子数组,d是分母数组。
例3 h= sym('[3/2, (2*x+1)/3; a/x+a/y, 3*x+4]')
[n, d]=numden(h)
3.符号表达式的因式分解与展开
MATLAB提供了符号表达式的因式分解与展开的函数,函数的调用格式为:
factor(s):对符号表达式s分解因式。
expand(s):对符号表达式s进行展开。
collect(s):对符号表达式s合并同类项。
collect(s,v):对符号表达式s按变量v合并同类项。
例 syms a b x y;
A=a^3-b^3;
factor(A) %对A分解因式
s=(-7*x^2-8*y^2)*(-x^2+3*y^2);
expand(s) %对s展开
collect(s,x) %对符号表达式s按变量x合并同类项(此例无同类项)
factor(sym('420')) %对符号整数分解因式
注意,factor(s)中的s必须为符号,不能是数值
4.符号表达式的化简
MATLAB提供的对符号表达式化简的函数有:
simplify(s)、simple(s)
simplify(s):应用函数规则对s进行化简。
例1.化简 (应该为)
syms x y
s=log(2*x/y)
simplify(s)
例2.化简 (应该为)
syms a
s=(1-a^2)/(1-a)
simplify(s)
simple(s):调用MATLAB的其他函数对表达式进行综合化简,并显示化简过程。这种函数可以试用几种不同的化简工具,然后在结果表达式中选择含有最少字符的那种形式。
例1.化简 (应该为)
syms x y
s=(x^2+y^2) ^2+(x^2-y^2) ^2
simple(s)
5.符号表达式与数值表达式之间的转换
利用函数sym可以将数值表达式变换成它的符号表达式。
例1.
sym(1.5) %注意与建立单个符号量a=sym('a')的区别
sym(3.14)
利用函数numeric或eval可以将符号表达式变换成数值表达式。
例1.
phi='(1+sqrt(5))/2'
numeric(phi)
例2.
eval('234/5')
6.符号表达式中变量的确定
MATLAB中的符号可以表示符号变量和符号常量。函数findsym可以帮助用户查找一个符号表达式中的的符号变量。该函数的调用格式为:
findsym(s,n)
函数返回符号表达式s中的n个符号变量,若没有指定n,则返回s中的全部符号变量。
例:
syms x a y z b; %定义5个符号变量
s1=3*x+y;s2=a*y+b; %定义2个符号表达式
findsym(s1) %返回s1中的全部符号变量
findsym(s2,2) %返回s2中的2个符号变量
findsym(5*x+2)
c=sym('3') %定义符号常量c
findsym(a*x+b*y+c) %符号常量c应该不在结果中
在求函数的极限、导数和积分时,如果用户没有定义自变量,MATLAB将按离字母x最近的原则确定默认变量。可以用findsym(s,1)查找系统的默认变量。
例
syms x a y w z b;
findsym(a*y+b*w,1)
findsym(a*z+b*w,1)
findsym(a*5+b,1)
2.4 MATLAB基本绘图
2.4.1 二维图形
图形可视化是MATLAB的一大特色
MATLAB的基本绘图函数是plot
plot(x,y)形式
已知自变量x取一组数值x1、x2、…xn,相应的函数y(x)也取一组数值y(x1)、y(x2)、…y(xn),
那么,plot(x,y)就用二维图形表示它们之间的函数关系
例1:取步长为0.1,在[0,2π]区间画出正弦曲线
x=0:0.1:2*pi; %在[0,2π]区间生成一个1维数组
y=sin(x); %建立正弦函数
plot (x, y) %画出y-x曲线
注意
1.绘图是在一定的取值范围内进行
2.当自变量和函数都是向量时,它们的维数必须相同,而且必须同为行向量或同为列向量
3.plot生成的图形可以保存为.fig文件
例2:取步长为0.5,在[0,2π]区间画出正弦曲线
x1=0:0.5:2*pi; %在[0,2π]区间生成一个1维数组
y1=sin(x1); %建立正弦函数
plot (x1, y1) %画出y1-x1曲线
注意
对区间分割的越细,计算的点就越多,就能真实逼近函数的连续变化,但是计算时间就越长
如果自变量的采样点不够多,就可能没有真实反映原函数
例3:关闭图形窗口,分别将例1和例2中最后的语句改为
figure, plot (x, y) %画出y-x曲线
figure, plot (x1, y1) %画出y1-x1曲线
注意
figure可以.生成的图形窗口
例4:绘制y=sin(tgx)- tg (sinx)在x [-π,π]区间内的曲线
先以0.05为步长构造x向量
x=[-pi:0.05:pi];
y=sin(tan(x))- tan(sin(x));
figure ,plot(x,y)
在x [-1.8,-1.2]和x [1.2,1.8]两个子区间内的曲线比较粗糙
在这两个子区间增加取样点
x=[-pi:0.05:-1.81,-1.8:0.001:-1.2,-1.195:0.05:1.2, 1.201:0.001:1.8,1.81:0.05:pi];
y=sin(tan(x))- tan(sin(x));
figure ,plot(x,y)
例5:绘制饱和非线性特性曲线,取x [-2,2]区间,步长为0.02。
符号函数
x=[-2:0.02:2];
y=1.1* sign(x).*(abs(x)>1.1)+x.*(abs(x)<=1.1);
plot(x,y)
注意
在分段描述的函数中,不要将子区间重复表示
如上例,不能写成y=1.1* sign(x).*(abs(x)>=1.1)+x.*(abs(x)<=1.1);
这样,相加的两项中都在x=1.1取值,这在MATLAB中虽然是允许的,但它不符合题意
plot(x,y,’s’)形式
这里s表示曲线的色彩、线型和数据点型
在MATLAB中,对线型和色彩的设置值如下
| 线型 | 符号 | - | : | -. | -- |
| 含义 | 实线 | 虚线 | 点划线 | 双划线 |
| 色彩 | 符号 | b | g | r | c | m | y | k | w |
| 含义 | 蓝 | 绿 | 红 | 青 | 品红 | 黄 | 黑 | 白 |
曲线一律用“实线”线型
只有一条曲线时,色彩是蓝色;多条曲线存在时,色彩表中的次序给出
例6:将上例的曲线画成红色虚线
plot(x,y,’r:’)
数据点型
在MATLAB中,也可以用点来表示函数的图形
MATLAB的数据点型设置如下
| 符号 | 含义 | 符号 | 含义 |
| . | 实心黑点 | d | 菱形符diamond |
| + | 十字符 | h | 六角星符hexagram |
| * | 八线符 | o | 空心圆圈 |
| ^ | 朝上三角符 | p | 五角星符pentagram |
| < | 朝左三角符 | s | 方块符square |
| > | 朝右三角符 | x | 叉字符 |
| v | 朝下三角符 |
x=0:0.1:2*pi; %在[0,2π]区间生成一个1维数组
y=sin(x); %建立正弦函数
plot (x, y,’-.rd’) %画出y-x曲线
注意,s中色彩、线型和数据点型符号对次序不敏感
实际上,这些设置可以在.fig文件中,通过“edit”菜单→“Current Object Properties…”(或点击“edit plot” 工具,点击曲线)→“line style”、“line color”、“style”修改
在plot(x,y)函数形式中,x和y可以是向量,也可以是矩阵。
当x和y是矩阵时,它们必须同维同阶。
这时将得到多条曲线
其中一条曲线表示y的第1列向量是x第1列向量的函数关系、另一条曲线表示y的第2列向量是x第2列向量的函数关系…等等
曲线的条数等于矩阵的列数
例6:在同一坐标中同时绘制正弦和余弦两条曲线
t= linspace(0,2*pi,100);
x=linspace(a,b,n),a和b分别是数组的第1个和最后一个元素,n是采样总点数(包括a和b),步长=(b-a)/(n-1))
x=[t; t]';
y=[sin(t); cos(t)]';
plot(x,y)
问题:如果不转置,会出现什么问题?
plot(x1,y1,x2,y2,…xn,yn)形式
当x1,y1,x2,y2,…xn,yn为向量时,x1和y1、x2和y2、…xn和yn分别组成向量对。每一组向量的长度可以不同。每一组向量可以绘制一条曲线,这样可以绘制多条曲线。
例9 用不同线型和颜色在同一坐标内绘制曲线y=2e-0.5xsin(2πx)及其包络线
x=(0:pi/100:2*pi)’;
y1=2*exp(-0.5*x)*[1,-1];
y2=2*exp(-0.5*x).*sin(2*pi*x);
x1=(0:12)/2; y3=2*exp(-0.5*x1).*sin(2*pi*x1); %其值为0
plot(x,y1,’k:’,x,y2,’b--’,x1,y3,’rp’);
双纵坐标函数plotyy
同时绘制具有不同纵坐标刻度的两个图形
plotyy(x1,y1,x2,y2)
x1,y1对应一条曲线,x2,y2对应另一条曲线,它们的横坐标刻度相同。纵坐标分左右两个,左边用于x1,y1,右边用于x2,y2
例10 用不同刻度在同一坐标内绘制曲线y1=2e-0.5xsin(2πx)及其包络线
x1=0:pi/100:2*pi;
x2=0:pi/100:3*pi;
y1= exp(-0.5*x1).*sin(2*pi*x1);
y2= 1.5*exp(-0.1*x2).*sin(x2);
plotyy(x1,y1,x2,y2);
注意,这时不能像plot函数那样对曲线属性进行设置,
如果要设置曲线的色彩、线型和数据点型符号,应使用句柄图形控制来完成
图形标识
坐标轴控制函数axis
基本形式:axis([xmin,xmax,ymin,ymax])
例11 用图形表示连续调制波形 及其包络线。
t=(0:pi/100:pi)';
y1=sin(t)*[1,-1];
y2=sin(t).*sin(9*t);
t3=pi*(0:9)/9;
y3=sin(t3).*sin(9*t3);
figure, plot(t,y1,t,y2,t3,y3,'mo')
然后再把最后的语句改成
figure, plot(t,y1,t,y2,t3,y3,'mo'); axis([0,pi,-0.8,0.8])
观察区别
图形名称:title
基本形式:title(S)
S可以取字符串。
字符串是与数值不同的一种数据类型,它用单引号对括起来
例12 将上个语句改为
figure, plot(t,y1,t,y2,t3,y3,'mo');title('连续调制波形')
坐标轴名称:xlabel、ylabel
基本形式:xlabel(S)、ylabel(S)
例12 将上个语句改为
figure, plot(t,y1,t,y2,t3,y3,'mo'); axis([0,pi,-1,1]);title('连续调制波形'); xlabel('x坐标'), ylabel('y坐标')
曲线图例:legend
用于区分各条曲线
基本形式:legend(S1,S2…)
S1,S2…分别对应按先后次序生成的曲线
例12 将上个语句改为
figure, plot(t,y1,t,y2,t3,y3,'mo'); axis([0,pi,-1,1]);title('连续调制波形'); xlabel('x坐标'), ylabel('y坐标');legend('包络线1','包络线2','调制波','零点')
坐标注释:text
基本形式:text(xt,yt,S)
表示在(xt,yt)坐标处书写字符注释
例12 将上个语句改为
figure, plot(t,y1,t,y2,t3,y3,'mo'); axis([0,pi,-1,1]);title('连续调制波形'); xlabel('x坐标'), ylabel('y坐标');legend('包络线1','包络线2','调制波','零点');text(17*pi/100, sin(17*pi/100), 'y=sin(t)'),text(67*pi/100, sin(67*pi/100).*sin(9*67*pi/100), 'y=sin(t)*sin(2t)')
分格线:grid
grid on,画出分格线
grid off,不画出分格线
grid:在以上两个命令之间切换
例1:取步长为0.1,在[0,2π]区间画出正弦曲线,画出分格线
x=0:0.1:2*pi; %在[0,2π]区间生成一个1维数组
y=sin(x); %建立正弦函数
plot (x, y) %画出y-x曲线
grid on
继续输入下面命令,观察图形窗口的变化
grid off
grid
grid
图形保持:hold
例1 在上例中,继续画出余弦曲线,观察图形变化
y1=cos(x); %建立余弦函数
plot (x, y1) %画出y1-x曲线
为了保持以存在的图形,应采用hold函数
hold on,启动图形保持功能
hold off,关闭图形保持功能
hold,在以上两个命令之间切换
例2 在上例中,启动图形保持功能,观察图形变化
plot (x, y) %画出y-x曲线
hold on
plot (x, y1) %画出y1-x曲线
继续输入下面命令,观察图形窗口的变化
hold off
plot (x, y1) %画出y1-x曲线
hold
plot (x, y) %画出y-x曲线
子图:subplopt
在绘图过程中,经常需要将几个图形画在同一个窗口中。
这些单个的图形称为子图。
调用格式:subplot(m,n,p)
它把一个图形窗口分割成m n个子绘图区,p表示子绘图区的编号,编号次序按行从左至右(这与数组和矩阵的编号不同)
例1 在4个子图中绘制不同的三角函数图
x=0:0.1*pi:2*pi;
subplot(2,2,1); plot(x,sin(x),'-*'); title('sin(x)');
subplot(2,2,2); plot(x,cos(x),'-o'); title('cos(x)'); axis([0,2*pi,-1.5,1.5]);
subplot(2,2,3); plot(x,sin(x).*cos(x),'-x'); title('sin(x).*cos(x)'); xlabel('x轴');
subplot(2,2,4); plot(x,sin(x)+ cos(x),'-h'); title('sin(x)+ cos(x)'); grid on;
注意,axis、hold、title、xlabel、ylabel、grid等函数是针对子图操作的
极坐标图:polar
基本形式:polar(theta,rho)或polar(theta,rho,s)
theta 为极角,rho为矢径,s为图形设置选项
例1 绘制ρ=sin(2θ)cos(2θ)的极坐标图
theta=0:0.01:2*pi; rho= sin(2*theta).*cos(2*theta);
polar(theta,rho,'k')
对数坐标图:loglog
x、y轴均采用为常用对数刻度
半对数坐标图:semilogx
x轴采用常用对数刻度,y轴保持线性刻度
半对数坐标图:semilogy
y轴采用常用对数刻度,x轴保持线性刻度
例1 绘制y=10x2的对数坐标图,并与直角线性坐标图进行比较
x=0:0.1:10; y=10*x.*x;
subplot(2,2,1),plot(x,y);title('plot(x,y)');grid on;
subplot(2,2,2); semilogx (x,y); title('semilogx (x,y)');grid on;
subplot(2,2,3); semilogy(x,y); title('semilogy(x,y)');grid on;
subplot(2,2,4); loglog (x,y); title(' loglog (x,y)');grid on;
饼状图:pie
用来表示各元素占总和的百分比
pie(X)
pie(X,explode)
X为一向量,一个饼图的某一部分对应向量X的某一个元素。explode有“特别引人注目”的意思,它是与X同长度的向量,它的元素取1或0。当某个元素取1时,与X对应的区域就突出
例1 某次考试,优秀、良好、中等、及格、不及格的人数分别为7、17、23、19、5,用饼图进行统计分析
X=[7,17,23,19,5];
figure,pie(X);
title('饼图'); legend('优秀', '良好', '中等', '及格', '不及格');
explode=[1,0,1,0,0];
figure,pie(X,explode);
隐函数绘制
隐函数就是满足方程f(x,y)=0的x和y之间的关系式。
当x和y之间的关系不能用显式表达时,就无法定义一个x向量,也就无法求出相应的y向量。从而不能用plot(x,y)绘制曲线。
ezplot可以直接绘制隐函数曲线
调用格式:ezplot(‘隐函数表达式')
例1 绘制隐函数f(x,y)=x2sin(x+y2)+y2ex+y+5cos(x2+y)=0的曲线
ezplot('x^2.*sin(x+y^2)+y^2.*exp(x+y)+5*cos(x^2+y)')
这是一个多值函数。
曲线的x取值范围(-6,6)由系统自动选取。
可以通过下面方式改变定义域
ezplot('x^2.*sin(x+y^2)+y^2.*exp(x+y)+5*cos(x^2+y)',[-10,10])
2.4.2 三维图形
三维曲线
三维曲线的基本绘图函数是plot3
调用格式:
plot3(x,y,z)
x,y,z为3个维数相同的向量。plot3(x,y,z)画出这些向量所表示的曲线。
plot3(X,Y,Z)
X,Y,Z为3个阶数相同的矩阵。plot3(X,Y,Z)这3个矩阵的列向量所表示的曲线
plot3(X,Y,Z,s)
s为线型、颜色、数据点型等字符串
plot3(x1,y1,z1,s1, x2,y2,z2,s2….)
组合绘图格式
plot3函数实际上是plot函数的3维扩展。与plot相比,只是增加了一个维数,其它都相同。
例1 绘制y=sin(x),z=cos(x)的曲线
x=0:pi/50:10*pi; y=sin(x); z=cos(x);
plot3(x,y,z);
例2 绘制x=8cost,y=4sint,z=-4sint,()的曲线
t=0:pi/50:2*pi;
x=8*cos(t); y=4*sqrt(2)*sin(t); z=-4*sqrt(2)*sin(t);
plot3(x,y,z, 'p');
title('Line in 3-D Space'); text(0,0,0, 'oringin');
xlabel('x'); ylabel('y'); zlabel('z');grid on;
三维曲面
函数z=f(x,y)表示3维曲面
在matlab中,z=f(x,y)不可能连续地取值
因此,所谓的曲面是由密集间隔的离散点构成。
或者说,曲面是由密集的间隔曲线构成,而曲线又是由一长串离散点构成
3维曲面函数
mesh(X,Y,Z,C)
C是指定各点用色的矩阵。mesh用于绘制3维网格图
surf(X,Y,Z,C)
用于绘制3维曲面图
例2 用3维曲面表现函数z=sinycosx
1.用mesh函数画
x=0:0.1:2*pi;
[X,Y]=meshgrid(x);
Z=sin(Y).*cos(X);
figure,mesh(X,Y,Z);
xlabel('x-axis'), ylabel('y-axis'), zlabel('z-axis');
title('mesh');
2.用surf函数画
x=0:0.1:2*pi;
[X,Y]=meshgrid(x);
Z=sin(Y).*cos(X);
figure,surf(X,Y,Z);
xlabel('x-axis'), ylabel('y-axis'), zlabel('z-axis');
title('surf');
3.用plot3函数画
x=0:0.1:2*pi;
[X,Y]=meshgrid(x);
Z=sin(Y).*cos(X);
figure,plot3(X,Y,Z);
xlabel('x-axis'), ylabel('y-axis'), zlabel('z-axis');
title('plot3');
注意
在mesh(X,Y,Z,S)和surf(X,Y,Z,S)的函数中,一般情况下,X、Y、Z是维数相同的矩阵。C是指定各点用色的矩阵。当C缺省时,C=Z。这时,颜色的设定正比于图形的高度,这样可以得到层次分明的3维图形。
在网格图(mesh)中,线条有颜色,线条间的补面无颜色
在曲面图(surf)中,线条和线条间的补面都有颜色
用plot3绘制的3维曲面实际上是由3维曲线组合而成。
与mesh函数相似的函数还有meshc和meshz
meshc:带等高线的3维网络曲面函数。
除具有mesh函数的功能外,还在xy平面上绘制曲面在z轴方向的等高线
meshz:带底座的3维网络曲面函数。
除具有mesh函数的功能外,还在xy平面上绘制曲面的底座
与surf函数相似的函数还有surfc和surfl
surfc:带等高线的曲面函数
surfl:具有光照效果的曲面函数
例3 在xy平面内选择区域[-8,8] [-8,8],绘制函数的上述4种3维曲面图
x=-8:0.5:8;
[X,Y]=meshgrid(x);
Z=sin(sqrt(X.^2+Y.^2))./ sqrt(X.^2+Y.^2+eps); %为什么加eps?eps是机器零阈值(机器的浮点运算误差限)
figure;meshc(X,Y,Z);title(' meshc(X,Y,Z)')
figure;meshz(X,Y,Z);title(' meshz(X,Y,Z)')
figure;surfc(X,Y,Z);title('surfc(X,Y,Z)')
figure;surfl(X,Y,Z);title('surfl(X,Y,Z)')
