matlab数值数组及向量化运算.docx

上传人:b****6 文档编号:4944994 上传时间:2022-12-12 格式:DOCX 页数:17 大小:94.91KB
下载 相关 举报
matlab数值数组及向量化运算.docx_第1页
第1页 / 共17页
matlab数值数组及向量化运算.docx_第2页
第2页 / 共17页
matlab数值数组及向量化运算.docx_第3页
第3页 / 共17页
matlab数值数组及向量化运算.docx_第4页
第4页 / 共17页
matlab数值数组及向量化运算.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

matlab数值数组及向量化运算.docx

《matlab数值数组及向量化运算.docx》由会员分享,可在线阅读,更多相关《matlab数值数组及向量化运算.docx(17页珍藏版)》请在冰豆网上搜索。

matlab数值数组及向量化运算.docx

matlab数值数组及向量化运算

第3章数值数组及向量化运算

MATLAB的核心内容:

数值数组和数组运算

.1数值计算的特点和地位

符号计算的局限性:

有很多问题1)无法解,2)求解时间过长

数值计算:

适用范围广,能处理各种复杂的函数关系,计算速度快,容量大。

【例3.1-1】已知

,求

(1)符号计算解法

symstx

ft=t^2*cos(t)

sx=int(ft,t,0,x)

ezplot(sx,0,5)

holdon

ft=

t^2*cos(t)

sx=

sin(x)*(x^2-2)+2*x*cos(x)

(2)数值计算解法

dt=0.05;

t=0:

dt:

5;

Ft=t.^2.*cos(t);

Sx=dt*cumtrapz(Ft);%小梯形面积的累加求Ft曲线下的面积,由一个个宽度为dt的小梯形面积累加得到的

t(end-4:

end)%end指示最后一个元素的位置

Sx(end-4:

end)

plot(t,Sx,'.k','MarkerSize',12)

xlabel('x'),ylabel('Sx'),gridon

图3.1-1在区间[0,5]采样点上算得的定积分值

【例3.1-2】已知

,求

(1)符号计算解法无解

symstx

ft=exp(-sin(t))

sx=int(ft,t,0,4)

(2)数值计算解法

dt=0.05;

t=0:

dt:

4;

Ft=exp(-sin(t));

Sx=dt*cumtrapz(Ft);

Sx(end)

plot(t,Ft,'*r','MarkerSize',4)

holdon

plot(t,Sx,'.k','MarkerSize',15)

holdoff

xlabel('x')

legend('Ft','Sx')

 

.2数值数组的创建和寻访

.2.1一维数组的创建

x=[1,3,5,7,9]逐个元素输入法

x=a:

inc:

b步长生成法,inc缺省时步长为1

x=linspace(a,b,n)线性采样法,以a,b为左右端点,产生1*n行数组

x=logspace(a,b,n)对数采样法,以a,b为左右端点,产生1*n行数组

运用diag,eye等标准数组生成函数。

【例3.2-1】一维数组的常用创建方法举例。

a1=1:

6

a2=0:

pi/4:

pi

a3=1:

-0.1:

0

b1=linspace(0,pi,4)

b2=logspace(0,3,4)%创建数组[100101102103]

c1=[2pi/2sqrt(3)3+5i]

.2.2二维数组的创建

10一小规模数组的直接输入法

【例3.2-2】在MATLAB环境下,用下面三条指令创建二维数组C。

a=2.7358;b=33/79;

C=[1,2*a+i*b,b*sqrt(a);sin(pi/4),a+5*b,3.5+i]

三个要素:

整个输入数组“[]”

行与行间“;”或“Enter”

同行中元素间“,”或“空格”

10二中规模数组的数组编辑器创建法

【例3.2-3】根据现有数据创建一个

的数组。

图3.2-1利用数组编辑器创建中规模数组

 

10三中规模数组的M文件创建法

【例3.2-4】创建和保存数组AM的MyMatrix.m文件。

(1)打开文件编辑调试器,并在空白填写框中输入所需数组(见图3.2-2)。

(2)最好,在文件的首行,编写文件名和简短说明,以便查阅(见图3.2-2)。

(3)保存此文件,并且文件起名为MyMatrix.m。

(4)以后只要在MATLAB指令窗中,运行MyMatrix.m文件,数组AM就会自动生成于MATLAB内存中。

图3.2-2利用M文件创建数组

10四利用MATLAB函数创建数组

【例3.2-5】利用最常用标准数组生成函数产生标准数组的演示。

ones(2,4)%产生(2×4)全1数组

randn('state',0)%把正态随机数发生器置0

randn(2,3)%产生正态随机阵

ans=

0.8644-0.8519-0.4380

0.09420.8735-0.4297

D=eye(3)%产生3×3的单位阵

diag(D)%取D阵的对角元

diag(diag(D))%外diag利用一维数组生成对角阵

randsrc(3,20,[-3,-1,1,3],1)%在[-3,-1,1,3]上产生3×20均布随机数组,随机发生器的状态设置为1

.2.3二维数组元素的标识和寻访

【例3.2-6】本例演示:

数组元素及子数组的各种标识和寻访格式;冒号的使用;end的作用。

A=zeros(2,6)

A(:

)=1:

12%单下标法:

单下标全元素寻访

A(2,4)%全下标法:

指定行、指定列

A(8)%单下标法:

单下标寻访

A(:

[1,3])%全下标法:

全部行、指定列

A([1,2,5,6])%单下标法:

生成指定的一维行(或列)数组

A(:

4:

end)%全下标法:

全部行、指定列,end表示最后一列。

A(2,1:

2:

5)=[-1,-3,-5]%全下标法:

指定行、指定列

 

B=A([1,2,2,2],[1,3,5])%全下标法:

指定行、指定列

.2.4数组操作技法综合

【例3.2-7】数组操作函数reshape,diag,repmat的用法;空阵[]删除子数组的用法。

a=1:

8

A=reshape(a,4,2)

A=reshape(A,2,4)%改变行数和列数

b=diag(A)%提取对角元素,。

B=diag(b)%生成对角阵

D1=repmat(B,2,4)%排列B模块repmat(A,m,n)createsalargematrixBconsistingofanm-by-ntilingofcopiesofA.

D1([1,3],:

)=[]%删除指定行

【例3.2-8】函数flipud,fliplr,rot90对数组的操作体现着“矩阵变换”。

A=reshape(1:

9,3,3)

B=flipud(A)%上下对称交换

C=fliplr(A)%左右对称交换

D=rot90(A,2)%逆时针旋转90度,2次

.3数组运算

MATLAB面向数组/矩阵编程和运算:

Ø用“数组或矩阵运算”模式去处理那些“借助循环而反复执行的标量运算”

●显著提高程序执行速度

●书写简洁、便于阅读

 

数组/矩阵运算符:

见MATLAB帮助

(在Index窗中输入+)

服从数组运算规则的函数及其它算符

举例

服从数组运算规则的函数

三角、反三角

sin,cos,tan,cot,sec,csc,asin,acos,atan,acot,asec,acsc

双曲、反双曲

sinh,cosh,…,asinh,acosh,…

指数、对数

exp,sqrt,pow2,log,log10,log2

圆整、求余

ceil,floor,fix,round,mod,rem

模、角、虚实部

abs,angle,real,imag,conj

符号函数

sign

关系运算符

==,~=,>,<,>=,<=

逻辑运算符

&,|,~

数组运算和向量化编程

尽可能用“数组或矩阵运算”指令

【例3.3-1】欧姆定律:

,其中

分别是电阻(欧姆)、电压(伏特)、电流(安培)。

验证实验:

据电阻两端施加的电压,测量电阻中流过的电流,然后据测得的电压、电流计算平均电阻值。

(测得的电压电流具体数据见下列程序)。

(1)非向量化程序

clear

vr=[0.89,1.20,3.09,4.27,3.62,7.71,8.99,7.92,9.70,10.41];

ir=[0.028,0.040,0.100,0.145,0.118,0.258,0.299,0.257,0.308,0.345];

%--------------------

L=length(vr);

fork=1:

L

r(k)=vr(k)/ir(k);

end

%---------------------------

sr=0;

fork=1:

L

sr=sr+r(k);

end

rm=sr/L

(2)向量化程序

clear

vr=[0.89,1.20,3.09,4.27,3.62,7.71,8.99,7.92,9.70,10.41];

ir=[0.028,0.040,0.100,0.145,0.118,0.258,0.299,0.257,0.308,0.345];

r=vr./ir%注意:

运算发生在两数组相同位置元素间

rm=mean(r)%MATLAB现成的求平均函数

【例3.3-2】用间距为0.1的水平线和垂直线均匀分割

的矩形域,在所有水平线和垂直线交点上计算函数

的值,并图示。

(1)非向量化编程

clear

x=-5:

0.1:

5;

y=(-2.5:

0.1:

2.5)';

N=length(x);

M=length(y);

forii=1:

M

forjj=1:

N

X0(ii,jj)=x(jj);%所有格点的x坐标

Y0(ii,jj)=y(ii);%所有格点的y坐标

Z0(ii,jj)=sin(abs(x(jj)*y(ii)));%所有格点的函数值

end

end

(2)向量化编程

x=-5:

0.01:

5;

y=(-2.5:

0.01:

2.5)';

[X,Y]=meshgrid(x,y);%指定矩形域内所有格点的(x,y)坐标

Z=sin(abs(X.*Y));%数组运算计算矩形域所有格点坐标(x,y)对应的函数值

%注意:

函数f(·)对数组的逐个元素起作用。

(3)比较二维双精度数是否相等

norm(Z-Z0)%范数接近eps,认为相等。

(4)绘图

surf(X,Y,Z)

xlabel('x')

ylabel('y')

shadinginterp

view([190,70])

图3.3-1指定域上的二元函数图形

end

.4“非数”和“空”数组

✧MATLAB中特有的两个概念和“预定义变量”

.4.1非数NaN(或记为nan)

等运算产生。

 

NaN的性质:

●NaN参与运算所得的结果也是NaN,即具有传递性;

●NaN没有“大小”概念,不能比较两个NaN的大小。

 

NaN的功用:

●真实记述

等运算的后果;

●避免可能因

等运算而造成程序执行的中断;

●在测量数据处理中,可以用来标识“野点(非正常点)”;

●在数据可视化中,可以裁剪图形。

【例3.4-1】非数的产生和性质演示。

(1)非数的产生

a=0/0,b=0*log(0),c=inf-inf

(2)非数的传递性

0*a,sin(a)

(3)非数的属性判断

class(a)

isnan(a)%唯一判断非数的指令

【例3.4-2】非数元素的寻访。

rand('state',0)%将随机发生器置0,Uniformlydistributedpseudorandomnumbers.

R=rand(2,5);R(1,5)=NaN;R(2,3)=NaN

LR=isnan(R)%对数组元素是否非数进行判断

LR=

00001

00100

si=find(LR)%确定非零数的“单下标”标识Findindicesandvaluesofnonzeroelements

[ri,ci]=ind2sub(size(R),si)%转换成“全下标”标识

[rj,cj]=find(LR)%直接确定非数的全下标

disp('非数在二维数组R中的位置')

disp(['单下标时的第',int2str(si

(1)),'和第',int2str(si

(2)),'个元素'])

si=

6

9

ri=

2

1

ci=

3

5

rj=

2

1

cj=

3

5

非数在二维数组R中的位置

单下标时的第6和第9个元素

.4.2“空”数组

Ø定义:

数组的某维长度为0或若干维长度均为0。

●MATLAB为操作和表述需要专门设计的一种数组。

【例3.4-3】关于“空”数组的算例。

(1)创建“空”数组的几种方法

a=[]%二维“空”(行、列长度均为0)数组

b=ones(2,0)

c=zeros(2,0)%“空”数组不同于全零数组

d=eye(2,0)

f=rand(2,3,0,4)

(2)“空”数组的属性

class(a)%数据类型

isnumeric(a)%是数值数组吗?

isempty(a)%唯一可正确判断数组是否“空”的指令

whicha%a是什么

ndims(a)%维数

size(a)%数组大小注意:

“空”数组并非“虚无”,它确实存在。

(3)“空”数组用于子数组的删除和大数组的大小收缩

A=reshape(-4:

5,2,5)

A(:

[2,4])=[]

 

.5关系操作和逻辑操作

MATLAB约定:

●关系(或逻辑)表达式中,作为输入的任何非0数都被看作是“逻辑真”,而只有0才被认为是“逻辑假”。

●计算结果,即输出,是由0和1组成的“逻辑数组(LogicalArray)”。

在此数组中的1表示“真”,0表示“假”。

●逻辑数组是一种特殊的数值数组。

与“数值类”有关的操作和函数对它同样适用。

它表示着对事物的判断结论“真”与“假”。

它有自身的特殊用途,如数组寻访等。

.5.1关系操作

关系操作符

指令

含义

<

小于

<=

小于等于

>

大于

>=

大于等于

==

等于

~=

不等于

【例3.5-1】关系运算示例。

A=1:

9,B=10-A

r0=(A<4)%比较在数组每个元素与标量之间进行,比较结果将与参与比较的数组同维。

r1=(A==B)%进行比较的两数组必须维数相同,比较在两数组相同位置上的元素间进行。

A=1:

9;

B=2:

9;

A>B

A='Yes'

B='No'

A~=B

字符串的比较

字符串与子字符串可以通过下面许多的方式进行比较。

􀁺两个字符串,或两个字符串的部分,看两者是否相同

􀁺两个独立的字符相比较看两者是否相同

􀁺检查字符串判断每一个字符是字母,还是空格

strcmp判断两字符串是否等价

􀁺strcmpi忽略大小写判断两字符串是否等价

􀁺strncmp判断两字符串前n个字符是否等价

􀁺strncmpi忽略大小写判断两字符串前n个字符是否等价

str1='hello';

str2='Hello';

str3='help';

c1=strcmp(str1,str2)

c2=strcmpi(str1,str2)

c3=strncmp(str1,str3,2)

a='fate';

b='cake';

result=a==b

函数upper和lower分别把一个字符串中所有转化大定和小写

result=upper('Thisistest1!

')

 

MATLAB把由数字组成的字符串转化为数字要用到函数eval。

例如,字符串“3.141592”

a='3.141592'

c=a+1

b=eval(a)

d=b+1

【例3.5-2】关系运算应用。

t=-3*pi:

pi/10:

3*pi;%自变量数组中,存在0值

y=sin(t)./t;%在t=0处,将产生非数。

tt=t+(t==0)*eps;%逻辑数组参与运算,使0元素被一个“机器零”小数代替

yy=sin(tt)./tt;%用sin(eps)/eps近似替代sin(0)/0极限

subplot(1,2,1),plot(t,y),axis([-9,9,-0.5,1.2]),%非数在绘图中的剪裁作用

xlabel('t'),ylabel('y'),title('残缺图形')

subplot(1,2,2),plot(tt,yy),axis([-9,9,-0.5,1.2])

xlabel('tt'),ylabel('yy'),title('正确图形')

图3.5-1采用近似极限处理前后的图形对照

 

.5.2逻辑操作

逻辑操作符

指令

含义

&

|

~

xor

异或

逻辑操作的引入,使复杂关系运算成为可能。

●标量可以与任何维数组进行逻辑运算。

运算比较在标量与数组每个元素间进行,运算结果与参与运算的数组同维。

●当逻辑运算中没有标量时,参与运算的数组必须维数相同。

逻辑运算在两数组相同位置上的元素间进行

●逻辑数组进行计算后成为数值数组

 

【例3.5-3】逻辑操作和关系操作。

本例演示:

逻辑、关系操作的组合;xor的作用。

(1)逻辑、关系操作的组合

A=[-2,-1,0,0,1,2,3]

L1=~(A>1)%哪些元素不大于1?

L2=(A>0)&(A<2)%哪些元素大于0且小于2?

L3=A>0&A<2

(2)xor的作用

A,B=[0,-1,1,0,1,-2,-3]

C=xor(A,B)%当A,B数组中,两个对应元素中仅一个为0时,给出1。

否则为0。

【例3.5-4】试绘制如图3.5-2最下那幅子图所示的“正弦波

的削顶半波整流波形”,削顶发生在每个周期的

之间。

本例演示:

逐段解析函数的计算和表现。

clear,t=linspace(0,3*pi,500);y=sin(t);

z1=((t2*pi)).*y;%获得整流半波

w=(t>pi/3&t<2*pi/3)+(t>7*pi/3&t<8*pi/3);%关系逻辑运算和数值运算

wn=~w;

z2=w*sin(pi/3)+wn.*z1;%获得削顶整流半波

subplot(4,1,1),plot(t,y,':

r'),axis([0,10,-1.5,1.5])

ylabel('y'),gridon

subplot(4,1,2),plot(t,z1,':

r'),axis([0,10,-0.2,1.5]),ylabel('z1')

subplot(4,1,3),plot(t,wn,':

r'),axis([0,10,-0.2,1.5]),ylabel('wn')

subplot(4,1,4),plot(t,z2,'-b'),axis([0,10,-0.2,1.5]),ylabel('z2')

xlabel('t')

图3.5-2逐段解析函数的产生

.5.3常用逻辑函数

MATLAB中能给出“逻辑数组”类型计算结果的逻辑函数很多,常用的如下表:

表3.5-3常用逻辑函数

分类

具体描述

含0数组判断

all

数组A不含0元素,返回1

A=[111

010

011]

all(A)

all(A,1)

all(A,2)

all(all(A))

any

数组A不是全0元素,返回1

生成逻辑数组

false

按指定大小,创建全0逻辑数组

false(3,2)

 

true

按指定大小,创建全1逻辑数组

logical

创建逻辑数组;1对应输入数组中的非0元素,其余都为0

A=logical(eye(3))

B=reshape(1:

9,3,3)

C=eye(3)

B(A)

B(C)

数据对象判断

isempty

是否空阵

isprime

是否质数

isfinite

是否有限数

isreal

是否实数

isinf

是否无穷大

isletter

是否字母(用于字符串)

isnan

是否非数

isspace

是否空格(用于字符串)

数据类型判断

isa

是否指定类别

ishandle

是否图柄

ischar

是否字符串

islogical

是否逻辑类型

isglobal

是否全局变量

isnumeric

是否数值类型

可通过MATLAB帮助系统获得上述常用逻辑函数的具体用法。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1