赞
踩
▲MATLAB中所有数据都是按照数组的方式进行存储和运算,数组和数组运算始终是MATLAB中的核心内容,使用数组和数组运算可以使计算机程序简单、易读,使程序命令更接近于教科书上的数学公式,而且还可以提高程序的向量化程度,提高计算效率,节省计算机开销。本章主要介绍数组及数组运算、多项式表示及运算和MATLAB中的关系及逻辑运算。
data1=[pi;log(5);7+6;2^3];
data2=[pi log(5) 7+6 2^3];
data3=2:2:10;
data4=2:10;
data5=linspace(2,10,5);
data6=logspace(1,5,10);
▲上面的例子基本演示了在MATLAB中创建一维数组的方法,主要有以下几种。
①直接输入法:data1和data2的创建方法就是直接输入法;
②步长生成法:data3和data4就是步长生成法,其通用方法是a:inc:b。其中a是数组的第一个元素;inc是创建数组之间的间隔,也就是步长,inc可以省略,默认数值为1;b是数组中的最后一个元素。
③定数线性采样法:data5就是,x=linspace(a,b,n),a和b分别是数组的第一个和最后一个元素;n是采样点数。
④定数对数采样法:data6就是,x=logspace(a,b,n),在设定“总个数n”的条件下,经过“常用对数”采样生成一维行数组。
▲在步长生成法中,步长参数inc的数值可以是正数,也可以是负数,当inc是正数的时候,必须满足a<b;当inc是负数的时候,必须满足a>b。
▲二维数组也成为矩阵,有如下6种创建方法:
(1)直接输入:将数据括在[ ] 中,同一行的元素用空格或逗号隔开,每一行可以用【Enter】键或分号隔开。
A=[ 1 2 3
4 5 6
1 2 6 ]
(2)函数eye:生成单位矩阵。
eye(n):生成 n x n 阶的单位E;
eye(m,n):生成 m x n 的矩阵E,对角线元素为1,其他元素为0;
eye(size(A)):生成一个矩阵与A大小相同的单位矩阵。
(3)函数ones:生成全1的矩阵。
ones(n):生成 n x n 全1矩阵;
ones(m,n):生成 m x n 的全1矩阵;
ones(size(A)):生成一个矩阵与A大小相同的全1矩阵;
ones(m,n,p,…):生成 m x n x p x …的全1的多维矩阵。
(4)函数zeros:生成全0矩阵。
zeros(n):生成 n x n 全0矩阵;
zeros(m,n):生成 m x n 的全0矩阵;
zeros(size(A)):生成一个矩阵与A大小相同的全0矩阵;
zeros(m,n,p,…):生成 m x n x p x …的全0的多维矩阵。
(5)函数rand:生成[0,1]之间均匀分布的随机函数。
Y=rand:生成一个随机数;
Y=rand(n):生成 n x n 的随机矩阵;
Y=rand(m,n):生成 m x n 的随机矩阵;
Y=rand(size(A)):生成一个矩阵与A大小相同的随机矩阵;
Y=rand(m,n,p,…):生成 m x n x p x …的随机数多维矩阵。
(6)函数randn:函数randn用来生成服从正态分布的随机函数。
Y=randn:生成一个服从标准正态分布的随机数;
Y=randn(n):生成 n x n 的服从标准正态分布的随机矩阵;
Y=randn(m,n):生成 m x n 的服从标准正态分布的随机矩阵;
Y=randn(size(A)):生成一个矩阵与A大小相同的服从标准正态分布的随机矩阵;
Y=randn(m,n,p,…):生成 m x n x p x …的服从标准正态分布的随机数多维数组。
▲在MATLAB中,习惯将二维数组的第一维称为“行”,第二维称为“列”,而对于第三位数组,其第三维则习惯性称为“页”。在MATLAB中,将三维或者三维以上的数组统称为高维数组。
1. 使用下标引用的方法创建三维数组。
A(2,2,2)=1;
for i=1:2
for j=1:2
for k=1:2
A(i,j,k)=i+j+k;
end
end
end
▲创建新的高维数组。
B(3,4,:)=2:5;
▲从结果中可以看出,当使用下标引用的方法创建高维数组的时候,需要使用各自对应的维度的,没有指定的数值则在默认情况下为0。
2. 使用低维数组创建高维数组。
D2=[1,2,3;4,5,6;7,8,9];
D3(:,:,1)=D2;
D3(:,:,2)=2 * D2;
D3(:,:,3)=3 * D2;
D3
3. 使用函数命令来创建高维数组。
①使用cat命令来创建高维数组。
D2=[1,2,3;4,5,6;7,8,9];
C=cat(3,D2,2 * D2,3 * D2);
▲cat命令的功能是连接数组,其调用格式为:
C=cat(dim,A1,A2,A3,A4…)。其中,dim表示创建数组的维度,A1,A2,A3,A4表示各维度上的数组。
②使用repmat命令来创建数组。
D2=[1,2,3;4,5,6;7,8,9];
D3=repmat(D2,2,3);
D4=repmat(D2,[1 2 3]); %1行、2列、3页
▲repmat命令的功能在于复制并堆砌数组,其调用格式:
B=repmat(A,m,n)。其中A表示复制的数组模块;用m个A组成行和n个A组成列拼成新的数组。
B=repmat(A,[m n p …])。其中A表示复制的数组模块;第二个输入参数则表示该数组模块在各个维度上的复制个数。(拼成的B:用m行、n列、p页个A…)
③使用reshape命令来创建数组。
D2=[1 2 3 4;5 6 7 8;9 10 11 12];
D3=reshape(D2,2,2,3);
D4=reshape(D2,2,3,2);
D5=reshape(D2,3,2,2);
▲reshape命令功能在于修改数组的大小,因此可以将二维数组通过该命令修改为三维数组,其调用格式为:
B=reshape(A,[m n p…])。其中,A表示待重组的矩阵;后面输入的则表示数组的各维的维度。(数组的元素个数不变,按列的顺序重新组合为新的数组)
1. 数组的寻址
▲数组中包含多个元素,因此对数组的单个元素或多个元素进行访问操作时,需要对数组进行寻址操作。在MATLAB中,数组寻址通过对数组下标的访问实现,MATLAB中提供end参数表示数组的末尾。
MATLAB在内存中以列的方向保存二维数组,对于一个m行n列的数组,i、j分别表示行、列的索引,二维数组的寻址可表示为A(i,j);如果采用下标寻址,则数组中元素的下标k表示为(j-1)x m+i。
一维数组的寻址:
A=randn(1,6)
A(5)
A(1 3 4 6)
A(5)寻址为第五个元素
A(1 3 4 6)寻址为A数组的1,3,4,6位置的元素
二维数组的寻址:
A=randn(3,4) %产生一个3x4的随机数组
A(6)
A(3,2)
A(6)表示按列开始寻址,到第六个元素
A(3,2)表示寻址到第三行第二列的元素
2. 数组的查找
▲MATLAB提供数组查找函数find,它能够查找数组中的非零数组元素,并返回其数组索引值。(数组列向排列查找)
indices=find(X) %查找X数组的非零元素的下标值
indices=find(X,k) %查找X数组的k项的非零元素的下标值
indices=find(X,k,‘first’) %正向查找X数组的k项的非零元素的下标值
indices=find(X,k,‘last’) %倒向查找X数组的k项的非零元素的下标值
3. 数组的排序
▲MATLAB提供数组排序函数sort,该函数可对任意给定的数组进行排序。sort函数的语法为:
B=sort(A) %1维是按列的方向进行排序
B=sort(A,dim) %2维是从列的方向及行的方向进行排序
其中,B为返回的排序后的数组;A为输入待排序的数组,当A为多维数组时,用指定需要排序的维数(默认为1维)。
4. 数组的转置
▲对数组进行转置。例如,对数组A的转置为A’。注意,当A为复数数组时,则A‘表示共轭转置,如果要实现非共轭转置,则应采用A.’。
A=[3+3i 3+2i;5+6i 6+7i]
A =
3.0000 + 3.0000i 3.0000 + 2.0000i
5.0000 + 6.0000i 6.0000 + 7.0000i
A’
ans =
3.0000 - 3.0000i 5.0000 - 6.0000i
3.0000 - 2.0000i 6.0000 - 7.0000i
A.’
ans =
3.0000 + 3.0000i 5.0000 + 6.0000i
3.0000 + 2.0000i 6.0000 + 7.0000i
5. 数组的重排
▲对已经存在的数组,可以根据其存储方式进行重排。例如:
a=[1 2;3 4;5 6]
b=a( : )
c=reshape(a,2,3) %变成2x3数组,注意变换前后的数组元素个数必须相等
d=zeros(2,2) %定义一个2x2的全零矩阵
d(:)=a(3:6) %从a阵中取出4个元素(第3个到第6个),构成新数组
6. 数组扩大
①连接操作符[ ]:像分块矩阵构造大数组一样,通过连接操作符[ ]可将小数组连接成大数组。
a=[1 2;3 4]
b=[a a+5;a-5 zeros(size(a))]
%利用小数组a生成4x4的大数组
c=[a;5 10] %给a数组的下面加上一行
d=[a [5;10]] %给a数组的右边加上一列
e=[[5;10] a] %给a数组的左边加上一列
②阵列连接函数cat:可以将两个数组按指定维度进行连接,从而得到大数组。
a=[1 2;3 4]
b=[5 6;7 8]
c=cat(1,a,b) %沿着第一维连接
d=cat(2,a,b) %沿着第二维连接
e=cat(3,a,b) %沿着第三维连接,生成多维矩阵
③阵列重复函数repmat:可以将小数组以重复的形式产生大数组。
t=repmat(a,2,3)
%将a数组复制两行三列产生新的大数组t。
7. 数组缩小
将大数组变成小数组的方法有两种:抽取法和删除法。
①抽取法是指从大的数组中抽取其中一部分,从而构成新的数组。
a=[1:4;5:8;9:12;13:16]
b=a(2:3,3:4) %抽取第二、第三行和第三、第四列
c=a([2 4],[1 3]) %抽取第二、第四行和第一、第三列
②删除法是在原来的数组中,利用空数组[ ]删除指定的行或列。
a(2,:)=[ ] %删除第二行
%空赋值只能具有一个非冒号索引。
a(:,[1,3])=[ ] %删除第一列和第三列
a(2)=[ ] %删除一个元素,无法构成数组,则剩余部分变为行向量
8. 数组变换
▲MATLAB提供了一组变换函数,如:rot90、tril、triu、fliplr、flipud等,它们可以将数组变换成期望的形式。
A=fix(10*rand(2,4)) %产生[0,10]之间均匀分布的随机数组
B1=tril(A,1),B2=triu(A,1) %上三角数组和下三角数组
C1=fliplr(A),C2=flipud(A) %左右、上下翻转
▲利用基本的数学函数,可以对数组进行运算。
a=[2 4;6 8]
b=sqrt(a) %计算平方根的函数
b =
1.4142 2.0000
2.4495 2.8284
d=exp(a) %以自然常数e为底的指数函数
d =
1.0e+03 *
0.0074 0.0546
0.4034 2.9810
▲利用取整和求余函数,可以得到整数或精确到小数点后的第几位。
x1=10-round(20 * rand(3,4))
%产生[-10,10]之间的随机数(取整)。
% rand(3,4):产生一个3x4的随机数组;
% 20*rand(3,4):产生一个20以内的3x4的随机数组;
% round:用于朝最近方向取整,即四舍五入。
x2=10-round(2000*rand(3,4))/100
%产生[-10,10]之间的随机数(精确到0.01)。
▲MATLAB提供了3个逻辑操作符&(与)、|(或)、~(非),与之相对应有3个逻辑操作函数and、or、not,它们的作用是相同的,只是使用格式略有差异。另外,xor(异或)是第4个逻辑操作函数。
▲在逻辑操作中,所有非零值元素都当作“1”(逻辑真)处理。
x=[23 -5;0 0.0001]
%x =
% 23.0000 -5.0000
% 0 0.0001~x
%ans =
% 2×2 logical 数组
% 0 0
% 1 0y=[0.1 0;-0.1 0]
%y =
% 0.1000 0
% -0.1000 0z1=x&y,z2=and(x,y)% %x、y的逻辑与
z3=xor(x,y)% %x、y的异或
▲MATLAB提供了6种关系操作符:>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、==(等于)、~=(不等于)。如果给定的关系成立,则操作结果为逻辑真(1),否则操作结果为逻辑假(0)。这些操作符于逻辑操作符配合使用,可使程序设计更加灵活。
if a>1
b=3 %语句1
elseif a==1
c=2 %语句2
else
d=1 %语句3
end
%上述语句表示当a>1,a=1,a<1时,分别执行语句1、语句2、语句3。
①点积
▲在高等数学中,向量的点积是指两个向量在其中某一个方向上投影的乘积,通常可以用来引申定义向量的模。
▲在MATLAB中,向量的点积可由函数dot来实现。
▲dot(a,b):返回向量a和b的数量点积。a和b必须同维。当a和b都为列向量时,dot(a,b)等同于a.*b。
▲dot(a,b,dim):返回a和b在维数为dim的点积。
a=[1 2 3]
b=[3 4 5]dot(a,b)
ans = 26sum(a.*b)
ans = 26dot(a,b,1)
ans = 3 8 15dot(a,b,2)
ans = 26
②叉积
▲在数学上,向量的叉积表示过两相交向量的交点的垂直于两向量所在平面的向量。在MATLAB中,向量的叉积由函数cross来实现。
▲cross(a,b):返回向量a和b的叉积向量,即c=a x b,a和b必须为三维向量。
▲cross(a,b,dim):当a和b为n维数组时,则返回a和b的dim维向量的叉积,a和b必须有相同的维数,且size(a,dim)和size(b,dim)必须为3.
a=[1 2 3]
b=[3 4 5]c=cross(a,b)
c = -2 4 -2 %得到同时垂直a、b的向量为±(-2,4,-2)
③混合积
▲向量的混合积由以上两个函数实现。
a=[1 2 3]
b=[4 5 6]c=cross(a,b)
c = -3 6 -3d=dot(a,cross(b,c))
d = 54
▲在一维空间中,实轴上任意两点a,b的距离,用两点差的绝对值 |a-b| 表示。绝对值是一种度量形式的定义。
▲范数是对函数、向量和矩阵定义的一种度量形式。任何对象的范数值都是一个非复实数。使用范数可以测量两个函数、向量或矩阵之间的距离。向量范数是度量向量长度的一种定义形式。范数有多种定义形式,只要满足下面3个条件即可定义为一个范数。同一向量,采用不同的范数定义,可得到不同的范数值。
▲对任一向量X ∈Rn,按照一个规则确定一个实数与它对应,记该实数为 ||X||,若 ||X|| 满足下面3个性质:
①ⅤX∈Rn,有 ||X|| ≥0,当且仅当X=U时,||X||=0(非负性);
②ⅤX∈Rn,有α∈R,有||α X|| = |α| ||X||(齐次性);
③ⅤX,Y∈Rn,有||X+Y|| ≤||X|| +||Y|| (三角不等式)。
那么称该实数||X||为向量X的范数。
▲许多实际应用的数组都是很庞大的,而且操作步骤较多、不能在短期内完成、需要多次分时进行这些庞大的数组的保存和加载就是一个重要问题了,因为每次在进行操作前对数组进行声明和赋值,需要很庞大的输入工作量。一个好的解决方法是将数组保存在文件中,每次需要时进行加载。
▲MATLAB中提供了内置的把变量保存在文件中的方法,最简单易用的方法是将数组变量保存为二进制的.mat文件。用户可以提供save命令将工作区中指定的变量储存在.mat文件中。
(1)save命令的一般语法是:
save < filename > < var1 >< var2 >…< varN >
▲其作用是把var1,var2,…,varN指定的工作区变量存储在filename指定名称的.mat文件中。通过save命令存储到.mat文件中的数组变量,在使用前可以用load命令加载到工作区中。
(2)load命令的一般语法是;
load< filename > < var1 >< var2 >…< varN >
load(‘filename.mat’, ‘a’) %加载filename文件中的a数组
▲其作用是把当前目录下存储在filename.mat文件中的var1,var2,…,varN指定的变量加载到MATLAB工作区中。
附:
▲save filename options 保存当前工作空间的所有变量到filename指定的文件中,此文件后缀名通常为.mat。如果不指定filename变量,则会默认保存到matlab.mat这个文件中。
具有以下options:
-append 在已经存在的mat文件中保存此变量。
-format 确定要保存变量的格式,有下面这些格式:
-ascii 8位ASCII格式
-ascii -tabs 8位ASCII格式以tab位分隔符
-ascii -double 16位ASCII格式
-ascii -double -tabs 16位ASCII格式以tab位分隔符
-mat 默认格式
★下面是一些例子:
①save test.mat 把当前工作空间的所有变量保存到test.mat文件中
②save(‘d:\myfiles\filename’,‘vol’,‘temp’,’-ASCII’) 把变量vol和temp保存到filename中,以ASCII 的格式
③使用whos -file filename.mat命令可以看到下面的信息:
whos -file filename.mat
Name Size Bytes Class Attributes
a 2x3 48 double
b 2x3 48 double
▲使用str = load(‘filename.mat’, ‘a’)可以看到下面的结果:
str = load(‘filename.mat’, ‘a’)
str =
a: [2×3 double]
④注意在使用 -append 选项时涉及到的文件,需要时已经存在,否在会报错.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。