数值数组及向量化运算文档格式.docx
《数值数组及向量化运算文档格式.docx》由会员分享,可在线阅读,更多相关《数值数组及向量化运算文档格式.docx(43页珍藏版)》请在冰点文库上搜索。
![数值数组及向量化运算文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/737ea6c2-6801-40fd-9188-0cceb2aea7ab/737ea6c2-6801-40fd-9188-0cceb2aea7ab1.gif)
NameSizeBytesClass
Ft1x101808doublearray
Sx1x101808doublearray
dt1x18doublearray
t1x101808doublearray
xqxqxq12341x11logicalarray
Grandtotalis305elementsusing2433bytes
1.进行数值计算,必须首先确定一组自变量采样点,即确定一个自变量的取值区间,并设定取样间隔;
2.数值计算的表达式都是在意志的数值采样点进行计算;
3.数值计算的结果也是离散的;
4.再将数值计算的结果扩展到更大的计算区域时不一定成立;
5.直接观察计算结果的离散数值难以看出函数关系,但图形有利于加深对函数的认识。
【例3.1-2】已知
symstx
ft=exp(-sin(t))
sx=int(ft,t,0,4)
exp(-sin(t))
Warning:
Explicitintegralcouldnotbefound.
>
Insym.intat58
int(exp(-sin(t)),t=0..4)
符号计算的能力有限,不是在任何情况下都可以得到计算结果;
4;
Ft=exp(-sin(t));
Sx(end)
bar(t,Ft)
15)
holdoff
xlabel('
x'
)
legend('
Ft'
Sx'
holdoff
ans=
3.0632
数值计算的应用非常广泛,只要给定计算区间、采用点和计算表达式,总是可以得到数值计算的结果。
3.2数值数组的创建和寻访
3.2.1一维数组的创建
1递增/减型一维数组的创建
主要特征:
(1)数组元素值的大小按照递增或者递减的顺序排列,元素之间的“差”是固定的或者“等步长”的。
(2)主要用作函数的自变量,for循环中的自变量等。
创建方法:
(1)“冒号”生成法
格式:
x=a:
inc:
b
x----变量名称;
a/b-----起点/终点
inc-----步长(正数或者负数)
例子:
(1)i=0:
1:
10
i=
012345678910
(2)i=0:
10
缺省的步长是1;
(3)i=0:
8.5
012345678
(4)i=0.5:
0.50001.50002.50003.50004.50005.50006.50007.50008.50009.5000
当abs(b-a)不能被inc整除,生成的最后一个元素将小于b;
(5)i=10:
-1:
0
109876543210
(6)i=10:
20
Emptymatrix:
1-by-0
步长可以为负数,但此时前面的元素必须大于后面的。
(2)线性(或者对数)定点法
x=linspace(a,b,n)%以a,b为左右端点,产生线性等间隔的(1*n)行数组;
x=logspace(a,b,n)%以10^a,10^b为左右端点,产生对数等间隔的(1*n)行数组;
xl=linspace(0,10,9)
xl=
01.25002.50003.75005.00006.25007.50008.750010.0000
x=linespace(a,b,n)<
===>
x=a:
(b-a)/(n-1):
xl=logspace(1,4,4)
10100100010000
logspace(x1,x2,N)用于在10^x1and10^x2之间产生N个对数均匀间隔的点。
2通用型一维数组的创建
(1)逐个元素输入法,最简单而通用的方法。
如:
y=[1,2,sin(pi/5),-exp(-3)]
y=
1.00002.00000.5878-0.0498
(2)使用Matlab函数生成,如rand(1,n),ones(1,n)
rand(1,10)%在[0,1]之间产生(1*10)的向量;
0.95010.23110.60680.48600.89130.76210.45650.01850.82140.4447
rand(5,5)
0.61540.40570.05790.20280.0153
0.79190.93550.35290.19870.7468
0.92180.91690.81320.60380.4451
0.73820.41030.00990.27220.9318
0.17630.89360.13890.19880.4660
rand(5,5)
0.55480.27310.90840.64080.9943
0.12100.25480.23190.19090.4398
0.45080.86560.23930.84390.3400
0.71590.23240.04980.17390.3142
0.89280.80490.07840.17080.3651
补充说明:
为了让前面出现过的随机数再次重复出现,需要对随机数生成器的“状态state”或者“种子seed”进行设置。
rand('
state'
0)%设置随机数生成器的状态
rand(1,5)
0.95010.23110.60680.48600.8913
0)%设置随机数生成器的状态
ones(3,8)
11111111
11111111
思考题、练习题:
(1)如何生成在(60,100)之间均匀随机分布的(5*8)的矩阵?
如何取整数呢?
(2)产生列数组x2=(1:
6)'
x2=linspace(0,pi,4)'
思考题答案:
(1)round(60+rand(5,8).*40)
9765836184838866
8768787584626387
6984628761757888
9485616461857889
8575736168897479
(2)
x2=(1:
x2=
1
2
3
4
5
6
0
1.0472
2.0944
3.1416
其他函数说明:
rand()%生成均匀分布的随机数组;
randn()%生成正态分布的随机数组;
round()%四舍五入取整数
zeros()%产生0
eye(N)%产生N*N的单位矩阵
eye(5)
10000
01000
00100
00010
00001
3.2.2二维数组的创建
一种方法是采用手工输入法,另外还有如下方法。
1小规模数组的直接输入法
【例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]
a=
2.7358
b=
0.4177
C=
1.00005.4716+0.4177i0.6909
0.70714.82443.5000+1.0000i
2中规模数组的数组编辑器创建法
在数组规模比较大了之后,就不适合采用直接手工输入方法了,可以采用数组编辑器。
【例3.2-3】根据现有数据创建一个
的数组。
图3.2-1利用数组编辑器创建中规模数组
3中规模数组的M文件创建法
(1)对于常用的数组,可以保存在一个mat文件中,然后就可以在后面调用了。
举例:
clear
a=(1:
10);
b=(11:
20);
c=(21:
30);
d=[a;
b;
c]
savemyMatrixd;
loadmyMatrix
d=
12345678910
11121314151617181920
21222324252627282930
如果要通过运行m文件产生数组,可以在m文件中编辑数组,然后再运行m文件即可。
在myMatirx.m文件中输入如下内容,然后运行myMatrix.m就可以载入该数组。
%Construct2Dmatrix
d=[12345678910
21222324252627282930]
【例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文件创建数组
4利用MATLAB函数创建数组
用于产生特殊二维数组/矩阵的函数如下:
diag()%产生对角数组
eye()%产生单位数组
magic()%产生魔方数组
rand()%产生随机数
randn()
random()
3.2.3二维数组元素的标识和寻访
【例3.2-6】本例演示:
数组元素及子数组的各种标识和寻访格式;
冒号的使用;
end的作用。
A=zeros(2,6)
A(:
)=1:
12
A=
000000
1357911
24681012
A(2,4)
A(8)
8
8
[1,3])
A([1,2,5,6]'
)
15
26
4:
end)%双下标,显示从第四列到最后一列的所有元素。
end表示最后一列
7911
81012
A(2,1:
2:
5)=[-1,-3,-5]
-14-38-512
A(2,[1:
5])=[-1,-3,-5]
A(2,[1,2,5])=[-1,-3,-5]
-1-3-38-512
B=A([1,2,2,2],[1,3,5])
B=
159
-1-3-5
-1-3-5
L=A<
3
A(L)=NaN
L=
100000
101010
NaN357911
NaN4NaN8NaN12
3.2.4数组构作技法综合
下面的指令完成数组的反转、提取、插入、收缩、重组等操作,用于对已经生成的数组进行修改、扩展。
指令
含义
diag
提取对角元素,或者生成对角阵
repmat
在指定的行数和列数铺方模块数足,以形成更大的数组
reshape
在总元素数量不变的前提下,改变数组的行数和列数
flipud
以数组的水平中线为对称轴,交换上下对称位置的数组元素
fliplr
以数组的垂直中线为对称轴,交换上下对称位置的树族元素
rot90
数组按照逆时针旋转90度。
【例3.2-7】数组操作函数reshape,diag,repmat的用法;
空阵[]删除子数组的用法。
a=1:
8
A=reshape(a,4,2)
A=reshape(A,2,4)
12345678
37
48
1357
2468
b=diag(A)
B=diag(b)
10
04
D1=repmat(B,2,4)
D1=
10101010
04040404
04040404
D1([1,3],:
)=[]
【例3.2-8】函数flipud,fliplr,rot90对数组的操作体现着“矩阵变换”。
A=reshape(1:
9,3,3)
147
258
369
B=flipud(A)
369
147
C=fliplr(A)
741
852
963
D=rot90(A)%旋转一次
D=
789
456
123
D=rot90(A,2)%旋转2次
963
741
3.3数组运算
1.数组运算的由来和规则
函数关系数值计算模型的分类
提高程序执行性能的三大措施
数组运算规则
A=reshape(1:
B=reshape(10:
18,3,3)
101316
111417
121518
转置运算
A'
123
789
A.'
A+B
111723
131925
152127
A.+B
?
Error:
UnexpectedMATLABoperator.
A-B
-9-9-9
-9-9-9
A.-B
对于数组运算,.+与+相同,.-与-相同
A.*B%数组计算
1052112
2270136
3690162
A*B%矩阵计算
138174210
171216261
204258312
注意数组计算与矩阵计算的差别。
A./B
0.10000.30770.4375
0.18180.35710.4706
0.25000.40000.5000
B.\A
A.\B
10.00003.25002.2857
5.50002.80002.1250
4.00002.50002.0000
B./A
注意\,/的差别:
A.^B
1.0e+017*
0.00000.00000.0003
0.00000.00000.0225
0.00000.00001.5009
B.^A
1.0e+011*
0.00000.00000.0027
0.00000.00000.0698
0.00000.00011.9836
a=5;
a+A
6912
71013
81114
a.+A
对于一个标量和一个数组的运算,不需要使用“.”运算符。
a-A
41-2
30-3
2-1-4
a.-A
对于一个标量和一个树组的加,减运算,不需要使用“.”运算符。
数组乘法运算:
a.*A
52035
102540
153045
A.*a
数组除法运算
a./A
5.00001.25000.7143
2.50001.00000.6250
1.66670.83330.5556
a.\A
0.20000.80001.4000
0.40001.00001.6000
0.60001.20001.8000
A./a
对于数组和标量得乘法和除法运算,必须使用“.”,注意\,/的差别。
a.^A
562578125
253125390625
125156251953125
A.^a
1102416807
32312532768
243777659049
注意:
下面进行的是矩阵运算,不是数组运算。
a*A
A*a
a/A
Errorusing==>
mrdivide
Matrixdimensionsmustagree.
a\A
这里进行的不是数组运算,而是矩阵运算。
总结:
(1)数组运算中,两个数组的加减乘除等都需要使用“.”运算;
(2)数组运算中,一个标量和一个数组的加减运算可以省略“.”运算;
(3)数组运算中,一个标量和一个数组的乘除运算不可以省略“.”运算,否则变成了矩阵运算。
思考题:
1为了对班级50名同学的学年综合测评的智育成绩进行统计,假设共有Eng,PE,Phy,Chn,Mth五门课程,分别用5*10的数组表示,学号为k的同学(k=1:
50)的课程成绩存储在五个数组中的第k个元素上,任何一门课程的成绩都在(60,100)之间均匀分布且为整数。
五门课程的学分为credit=[3,5,4,2,4[,请完成如下统计:
(1)统计各门课程的平均分,存入变量meanScore中,;
(2)统计班级学生的加权平均分;
(3)统计加权平均分为60~69分的同学的数量,存入数组a;
(4)统计加权平均分为70~79分的同学的数量,存入数组b;
(5)统计加权平均分为80~89分的同学的数量,存入数组c;
(6)统计加权平均分为90分及以上的同学的数量,存入数组d;
(7)将如上四个分数段的同学的数量存入数组E中。
Eng=round(60+(rand(5,10)*40))
Eng=
98908