ch3数组.docx
《ch3数组.docx》由会员分享,可在线阅读,更多相关《ch3数组.docx(30页珍藏版)》请在冰豆网上搜索。
ch3数组
第3章数组运算及数组化编程
与其它编程语言不同,MATLAB数据的保存和传送的基本单元不是标量,而是复数阵列型数据,即数组;MATLAB算术、关系、逻辑运算的基本运算单元也不是标量,而是数组;MATLAB提供的许多M函数的基本作用单元也不是标量,而是数组。
基于数组、数组运算在MATLAB中的基本地位,本章将系统阐述:
有关数组的各种基本概念、数组的编制和寻访、数组运算的基本含义和通则、以及数组化编程的重要性。
对于外形、元素排列和编址都与二维数组相同,但概念、运算规则又绝然不同的矩阵,本章也将安排专门的节次加以详述。
不但讲述矩阵与数组的区别,而且要特别强调矩阵化编程的重要性,因为矩阵是MATLAB诞生和发展的原动力。
本章之所以如此强调数组与矩阵的区别,是为了帮助读者正确理解“MATLAB帮助文档中Matrix、Vector英文词汇的泛义以及在它们不同意境下定义的两组运算”。
.1数组、结构和创建
.1.1数组及其结构
101数组的维度
图3.1-1二维数组的结构及相关术语
102数组的规模及相关术语
103获取数组结构参数的M指令
〖说明〗
.1.2行(列)数组的创建
101递增/减型行(列)数组的创建
〖说明〗
102其他类型行(列)数组的创建
(1)
(2)
【例3.1-1】
a1=1:
6%
na1=ndims(a1)%
Sa1=size(a1)%
La1=length(a1)%
a1=
123456
na1=
2
Sa1=
16
La1=
6
a2=0:
pi/4:
pi%
a3=1:
-0.1:
0%
a2=
00.78541.57082.35623.1416
a3=
Columns1through6
1.00000.90000.80000.70000.60000.5000
Columns7through11
0.40000.30000.20000.10000
b1=linspace(0,pi,4)%
b2=logspace(0,3,4)%
b1=
01.04722.09443.1416
b2=
1101001000
c1=[2pi/2sqrt(3)3+5i]%
c1=
Columns1through3
2.00001.57081.7321
Column4
3.0000+5.0000i
rngdefault%
c2=rand(1,5)%
c2=
0.81470.90580.12700.91340.6324
〖说明〗
.1.3二维通用数组的创建
101小规模数组的直接输入法
【例3.1-2】
1)
a=2.7358;b=33/79;%
na=ndims(a)%
sa=size(a)%
na=
2
sa=
11
2)
C=[1,2*a+i*b,b*sqrt(a);sin(pi/4),a+5*b,3.5+i]%
nC=ndims(C)%
SC=size(C)%
C=
1.0000+0.0000i5.4716+0.4177i0.6909+0.0000i
0.7071+0.0000i4.8244+0.0000i3.5000+1.0000i
nC=
2
SC=
23
〖说明〗
102中规模数组的数组编辑器创建法
【例3.1-3】
0.64590.96370.52890.07100.83260.9786
0.43760.38340.56800.08710.77820.7992
1.89180.79170.92560.02020.87000.4615
操作步骤如下:
1)
2)
3)
4)
图3.1-2
103中规模的M文件创建法
【例3.1-4】
操作步骤如下:
1)打开文件编辑器EDITOR
2)编写脚本内容
3)保存文件
4)运行文件生成数组
图3.1-3
104利用MATLAB函数创建数组
表3.1-1
指令
含义
指令
含义
diag
ones
eye
zeros
magic
rand
random
randn
randsrc
gallery
【例3.1-5】
ones(2,4)%
ans=
1111
1111
rng(0)%
randn(2,3)%
ans=
0.5377-2.25880.3188
1.83390.8622-1.3077
D=eye(3)%
D=
100
010
001
diag(D)%
ans=
1
1
1
diag(diag(D))%
ans=
100
010
001
randsrc(3,20,[-3,-1,1,3],1)
%
%
ans=
Columns1through12
-1-1-31-31-333-3-31
1-3-1-13-1-3-13-3-11
-3-3-11-3131-333-1
Columns13through20
13-1-1-11-1-3
3333-3-3-31
-31-3-1-3-111
.1.4数组构作技法综合
表3.1-2
指令
含义
diag
repmat
reshape
flipud
fliplr
rot90
【例3.1-6】
a=1:
8%
A=reshape(a,4,2)%
A=reshape(A,2,4)%
a=
12345678
A=
15
26
37
48
A=
1357
2468
b=diag(A)%
B=diag(b)%
b=
1
4
B=
10
04
D1=repmat(B,2,4)%
D1=
10101010
04040404
10101010
04040404
D1([1,3],:
)=[]%
D1=
04040404
04040404
【例3.1-7】
A=reshape(1:
9,3,3)
A=
147
258
369
B=flipud(A)%
B=
369
258
147
C=fliplr(A)%
C=
741
852
963
D=rot90(A,2)%
D=
963
852
741
.2数组元素编址及寻访
.2.1数组元素的编址
101全下标编址和单序号编址
(1)
(2)
图3.2-1
102两种编址间的转换
〖说明〗
.2.2二维数组元素的寻访
101按址寻访
表3.2-1
格式
使用说明
全下标
寻访
A(r,c)
A(r,:
)
A(:
c)
单序号
寻访
A(ind)
A(:
)
102按条件寻访
【例3.2-1】
1)
clear
A=[1:
3:
16;2:
3:
17;3:
3:
18]%
A=
147101316
258111417
369121518
2)
Ass1=A(2,3)%
r=[2,3];%
c=[1,5];%
As22=A(r,c)%
%
Ass1=
8
As22=
214
315
As26=A([1,3],:
)%
As26=
147101316
369121518
3)
Ais1=A(8)%
ind=[1,3,18];%
%
Ai1r=A(ind)%
Ai1c=A(ind')%
Ais1=
8
Ai1r=
1318
Ai1c=
1
3
18
4)
A(r,c)=zeros(2,2)%
A([1,end])=-A([1,end])%<13>
A=
147101316
05811017
06912018
A=
-147101316
05811017
069120-18
5)
L=A<=0%
AL=A(L)%
L=
100000
100010
100011
AL=
-1
0
0
0
0
-18
A(L)=NaN%
A=
NaN47101316
NaN5811NaN17
NaN6912NaNNaN
〖说明〗
.3数组运算
.3.1实施数组运算的算符
101算符数组运算通则
102算术、关系、逻辑算符
表3.3-1
算术运算
ArithmeticOperations
算符
+
-
.*
.\或./
.^
名称
加
减
数组乘
数组左除或数组右除
数组幂
示例
关系运算
RelationalOperations
算符
>
<
>=
<=
==
~=
名称
大于
小于
大于等于
小于等于
等于
不等于
示例
逻辑运算
LogicalOperations
算符
&
|
~
xor
名称
与
或
非
异或
示例
103各种算符的优先级别
表3.2-3
代数运算
.^
.*、./、.\
+、-
关系运算
==、~=
>、<、>=、<=
逻辑运算
~
&
|
104算符数组运算实例及机理解释
【例3.3-1】
clear
t=-3*pi:
pi/10:
3*pi;%
st=sin(t);%<3>
y=st./t;%<4>
Lt=(t==0);%<5>
tt=t+Lt.*realmin;%<6>
yy=sin(tt)./tt;%<7>
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.3-1
〖说明〗
图3.3-2
图3.3-3
图3.3-4
【例3.3-2】
1)
A=[-2,-1,0,0,1,2,3]
B=[0,-1,1,0,1,-2,-3]
disp(['A的数据类型是',class(A)])
A=
-2-100123
B=
0-1101-2-3
A的数据类型是double
2)
R1=A==B%<4>
R2=A>B%<5>
fprintf('R1的数据类型是什么?
%s\n',class(R1))
fprintf('R2的数据属于逻辑类?
(1为真;0为假)%d\n',islogical(R2))%<7>
R1=
0101100
R2=
0000011
R1的数据类型是什么?
logical
R2的数据属于逻辑类?
(1为真;0为假)1
3)
LA=logical(A)%<8>
LB=logical(B)
L1=LA&LB
LL1=A&B%
LA=
1100111
LB=
0110111
L1=
0100111
LL1=
0100111
4)
L3=xor(LA,LB)%
LL3=xor(A,B)%<12>
L3=
1010000
LL3=
1010000
5)
TOTAL1=all([1,1,1,1,1])
TOTAL2=all([1,0,1,1,1])
TOTAL1=
1
TOTAL2=
0
6)
ANYONE1=any([0,1,0,0,0])
ANYONE2=any([0,0,0,0,0])
ANYONE1=
1
ANYONE2=
0
〖说明〗
.3.2实施数组运算的函数
101函数数组运算通则
102服从数组运算通则的M函数
表3.2-4服从数组运算通则的MATLAB函数
分类
M函数名称
三角函数
Trigonometry
弧度单位
sin,cos,tan,cot,sec,csc
asin,acos,atan,acot,asec,acsc
度数单位
sind,cosd,tand,cotd,secd,cscd
asind,acosd,atand,acotd,asecd,acscd
双曲类
sinh,cosh,tanh,coth,sech,csch
asinh,acosh,atanh,acoth,asech,acsch
指数函数
Exponential
exp
log,log10,log2,log1p,reallog
nexpow2,pow2,realpow,
sqrt,realsqrt,nthroot
复函数
Complex
abs,angle
real,imag,conj,
sign,unwrap
圆整求余函数
RoundingandRemainder
ceil,fix,floor,idivide,mod,rem,round
特殊函数
SpecialFunctions
airy,besselh,besseli,beta,ellipj,erf,erfinv,
gamma,gammaln,psi
数据类型转换函数
ConversionFunction
char,double,logical,int2str,int8,int16,num2str,uint8,uint16
示例
.3.3数组运算中的溢出及非数处理
.3.4数组化编程
(1)
(2)
【例3.3-3】
1)
functiony=exm030303_1(x)
%exm030303_1
%x
%y
M=length(x);
y=zeros(1,M);
forjj=1:
M
ifx(jj)<=-1
y(jj)=x(jj);
elseif-1y(jj)=x(jj)^3*cos(2*pi*x(jj));
else
y(jj)=exp(-x(jj)+1);
end
end
functiony=exm030303_2(x)
%exm030303_2
L1=x<=1;%<2>
L2=-1
L3=1
y=zeros(size(x));%<5>
y(L1)=x(L1);%<6>
y(L2)=x(L2).^3.*cos(2*pi*x(L2));%<7>
y(L3)=exp(-x(L3)+1);%<8>
2)
x=-2:
0.01:
2;%
y1=exm030303_1(x);%
y2=exm030303_2(x);%
e12=max(abs(y1(:
)-y2(:
)))%
clf%
plot(x,y2,'r','Linewidth',3)%
xlabel('x'),ylabel('y')%
gridon%
axis([-2,2,min(min(y1)),max(max(y1))])%
e12=
0
图3.3-5
〖说明〗
.4矩阵及其运算
.4.1矩阵和数组的异同
表3.4-1
数组
矩阵
概念
来源和背景
一般
记述方式
维(度)
的含义
元素
排列结构
算法定义
加法
乘法
代数结构
.4.2矩阵运算符和矩阵函数
101独特的矩阵运算符
表3.4-2
矩阵运算名称
算符
运算规则
乘
标量与矩阵乘
*
矩阵与矩阵乘
除
左除
或
右除
\
或
/
幂
标量为底的方阵指数
^
方阵底的标量指数
102矩阵函数
表3.4-3
分类
函数名称
举例
M码
M码的数学内涵简述
专用矩阵函数
矩阵指数函数
矩阵对数函数
矩阵平方根函数
通用矩阵函数
【例3.4-1】
1)
Am=magic(3)%
Aa=reshape(1:
12,3,4)%
B=repmat(1:
4,3,1)%
Am=
816
357
492
Aa=
14710
25811
36912
B=
1234
1234
1234
2)
AmmB=Am*B%
AamB=Aa.*B%
AmmB=
15304560
15304560
15304560
AamB=
182140
2102444
3122748
3)
AmLdB=Am\B%
AaadB=Aa.\B%
AmLdB=
0.06670.13330.20000.2667
0.06670.13330.20000.2667
0.06670.13330.20000.2667
AaadB=
1.00000.50000.42860.4000
0.50000.40000.37500.3636
0.33330.33330.33330.3333
4)
Amm2=Am^2%
Ama2=Am.^2%
Amm2=
916767
679167
676791
Ama2=
64136
92549
16814
5)
Am2m=2^Am%
Am2a=2.^Am%
Am2m=
1.0e+04*
1.09421.09061.0921
1.09121.09331.0924
1.09151.09301.0923
Am2a=
256264
832128
165124
6)
rng(0)%
D=randn(3,3);%
AmLdD=Am\D%
DRdAm=D/Am%
AmLdD=
-0.3301-0.00270.1153
-0.2305-0.18360.4118
0.56810.1778-0.2946
DRdAm=
0.0349-0.14040.1699
0.2438-0.19310.1156
-0.32220.9731-0.6501
.4.3矩阵化编程
【例3.4-2】采用“实数标量+循环”法和“MATLAB矩阵乘算符”分别计算两个复数矩阵
和
的乘积。
1)
functionD=exm030402_1(A,B)
%D=exm030402_1(A,B)
%A、B
%D
[m,p]=size(A);%
[q,n]=size(B);%
ifp~=q%
error('A阵的列数不等于B阵的行数,所以A不能与B相乘!
')
end
forii=1:
m
forjj=1:
n
wr=0;wi=0;
fork=1:
p
wr=wr+real(A(ii,k))*real(B(k,jj))...
-imag(A(ii,k))*imag(B(k,jj));
wi=wi+real(A(ii,k))*imag(B(k,jj))...
+imag(A(ii,k))*real(B(k,jj));
end
D(ii,jj)=wr+j*wi;
end
end
2)
clear
rng('default')%
m=100;p=300;n=200;
A=randn(m,p)+1j*randn(m,p);%
B=randn(p,n)+1j*randn(p,n);%
3)
tic%
Dc=exm030402_1(A,B);%
Tc=toc;%
4)
tic
Dm=A*B;%
Tm=toc;%
5)
RE=abs((Dm-Dc)./Dm);%
re=max(RE(:
));%
tmc=Tm/Tc;%
fprintf('两种编码所得矩阵间的最大元素相对误差为%6.4e\n',re)
fprintf('“直接乘算符法”耗时与“标量循环法”耗