810 likes | 955 Views
第二章 Matlab 编程基础. 数组和矩阵基本运算. 主要内容:. 2.1 矩阵 和数组 2.2 matlab 基本运算 2.3 matlab 语言结构与编程 2.4 文件 I/O. 2.1 矩阵和数组. 2.1.1 基本概念 2.1.2 矩阵和数组的创建 2.1.3 矩阵和数组的访问 2.1.4 矩阵操作. 2.1.1 基本概念. 1. 变量 所谓变量,就是指在程序运行过程中需要改变数值的量,每一个变量都具有一个名字,变量将在内存中占据一定的空间,以便在程序运行的过程中保存其数值。
E N D
第二章 Matlab编程基础 数组和矩阵基本运算
主要内容: • 2.1 矩阵和数组 • 2.2 matlab基本运算 • 2.3 matlab语言结构与编程 • 2.4 文件I/O
2.1 矩阵和数组 • 2.1.1 基本概念 • 2.1.2 矩阵和数组的创建 • 2.1.3 矩阵和数组的访问 • 2.1.4 矩阵操作
2.1.1 基本概念 • 1.变量 • 所谓变量,就是指在程序运行过程中需要改变数值的量,每一个变量都具有一个名字,变量将在内存中占据一定的空间,以便在程序运行的过程中保存其数值。 • 对变量的命名有相应的要求:变量必须以字母开头,后面可以是19个字母、数字或者下划线的组合
2.数组 • 数组是有序数据的集合,在大多数编程语言中,数组的每一个成员(元素)都属于同一种数据类型,它们使用同一个数组名称和不同的下标来惟一确定数组中的成员(元素)。
3. 向量 • 从编程语言的角度上看,向量其实就是一维数组,然而从数学的角度上看,向量就是1×N或者N×1的矩阵,即行向量或列向量 • MATLAB的基本运算单位就是矩阵和向量,而M语言本身就是以向量化运算为基础的编程语言
4.矩阵 • 在MATLAB中,矩阵的概念就是线性代数中定义的矩阵的概念——矩阵是用一对圆括号或者方括号括起来,符合一定规则的数学对象。例如:
2.1.2 数组和矩阵的创建 • 1. 创建向量 • 2. 创建矩阵 • 3. 稀疏矩阵
1.创建向量 • 从编程语言的角度上看,向量也就是一维数组。在MATLAB中创建向量可以使用五种不同的方法,最直接也最简单的方法就是逐个输入向量的元素 • 1).创建行向量 • 2).创建列向量
1).创建行向量 • (1)直接创建,通过直接输入数组中每个元素的值来创建数组,方法为以左方括号开始,以空格或逗号为间隔输入元素值,最后以右方括号结尾 • 例:在命令窗口输入X=[1 2 3 4 5 6 7 8 9]或x=[1,2,3,4,5,6,7,8,9] • (2)利用冒号运算符创建向量 • X=初值:终值,创建从初值开始到终值结束,增量为1的行向量x • 例:x=0:10
(3)x=初值:增量:终值,创建从初值到终值,给定增量的行向量(3)x=初值:增量:终值,创建从初值到终值,给定增量的行向量 • 例:x=0:0.1:1 • (4)利用函数X=linspace(初值,终值,n)创建从初值开始到终值结束,有n个元素的行向量 • 例:x=linespace(0,pi,11) • (5)利用函数x=logspace(初值,终值,n)创建从初值开始到终值结束,有n个元素对数分隔量。 • 例:x=logspace(0,1,11) • 1.0000 1.2589 1.5849 1.9953 2.5119 3.1623 3.9811 5.0119 6.3096 7.9433 10.0000
2). 创建列向量 • (1)直接输入元素法。通过直接输入数组中每个元素的值来创建数组,方法为以左方括号开始,以分号为间隔输入元素值,最后以右方括号结尾 • 例:A = [1;2;3;4;5;6] • (2)使用转置的方法 • 例:B = (1:6)'
2.创建矩阵 • 1)直接输入法 • A = [1 2 3;4 5 6;7 8 9]或A = [1,2,3;4,5,6;7,8,9] • 在创建矩阵的时候,需要注意: • 整个矩阵的元素必须在“[ ]”中键入 • 矩阵的元素行与行之间需要使用分号;间隔,也可以在需要分行的地方用回车键间隔 • 矩阵的元素之间可以使用逗号或者空格间隔。 • 其实创建上面的矩阵时还可以这么做 • A = [1:3;4:6;7:9]
2)创建特殊矩阵 • (1)随机数矩阵 • rand(x,y)产生x行y列的随机数矩阵 • (2)全1阵 • ones(n) 产生n行n列的全1方阵 • ones(x,y) 产生x行y列的全1矩阵 • (3)全零阵 • zeros(n)产生n行n列的全零方阵 • zeros(x,y)产生x行y列的全零矩阵 • (4)对角矩阵 • eyes(x,y)产生x行y列的对角阵
3.稀疏矩阵 • 在实际工作中,经常遇到这样一类矩阵,这类矩阵中数值为0的元素居多,这类矩阵一般被称为稀疏矩阵。如果使用满阵的方式来表示稀疏矩阵,则0元素将占用相当的内存空间,特别是在MATLAB中,由于MATLAB默认的数据类型是双精度类型,每一个双精度类型的数据元素都要占用八个字节的内存空间,当0元素很多的时候将占用相当可观的内存空间,因此,在MATLAB中,专门提供了稀疏矩阵的表示方法。
创建稀疏矩阵 • 在MATLAB命令行窗口中键入下面的指令: • >> A = eye(5) • A = • 1 0 0 0 0 • 0 1 0 0 0 • 0 0 1 0 0 • 0 0 0 1 0 • 0 0 0 0 1
B = sparse(A) • B = • (1,1) 1 • (2,2) 1 • (3,3) 1 • (4,4) 1 • (5,5) 1 • >> whos • Name Size Bytes Class • A 5x5 200 double array • B 5x5 84 double array (sparse) • Grand total is 30 elements using 284 bytes
在上例中,首先使用eye函数创建了五阶的单位矩阵,五阶单位方阵一共有25个元素,其中却有20个元素是0,于是使用sparse函数将该函数构造成为稀疏矩阵,这样就得到了矩阵B。在上例中,首先使用eye函数创建了五阶的单位矩阵,五阶单位方阵一共有25个元素,其中却有20个元素是0,于是使用sparse函数将该函数构造成为稀疏矩阵,这样就得到了矩阵B。 • 通过whos指令可以清晰地比较两个矩阵占用的内存空间,A矩阵占用了200个字节,而B矩阵仅占用了84个字节。
稀疏矩阵和普通矩阵(满阵)之间可以直接进行运算,例如稀疏矩阵和普通矩阵(满阵)之间可以直接进行运算,例如 • >> A+B • ans = • 2 0 0 0 0 • 0 2 0 0 0 • 0 0 2 0 0 • 0 0 0 2 0 • 0 0 0 0 2 • 这里运算得到的结果是一个满阵。
MATLAB中使用“三元组”表示法来表示稀疏矩阵,该表示方法一般由三个向量组成: MATLAB中使用“三元组”表示法来表示稀疏矩阵,该表示方法一般由三个向量组成: • 第一个向量是由矩阵中非零元素组成的向量,其长度一般为nzmax,即矩阵中所有非零元素的个数; • 第二个向量是非零元素的行序号,该向量的长度也为nzmax; • 第三个向量是非零元素的列序号,该向量的长度也为nzmax。
例如对于下面的稀疏矩阵: • 因此,表示矩阵的三个向量分别为 • >> data = [15 91 11 3 28 22 −6 −15]; • >> ir = [ 1 5 2 2 6 1 3 1]; • >> jc = [1 1 2 3 3 4 4 6];
利用上面的三个矩阵和sparse函数创建六行六列的稀疏矩阵:利用上面的三个矩阵和sparse函数创建六行六列的稀疏矩阵: • >> S = sparse(ir,jc,data,6,6) • S = • (1,1) 15 • (5,1) 91 • (2,2) 11 • (2,3) 3 • (6,3) 28 • (1,4) 22 • (3,4) -6 • (1,6) -15
>> %将该矩阵还原成满阵 • >> full(S) • ans = • 15 0 0 22 0 -15 • 0 11 3 0 0 0 • 0 0 0 -6 0 0 • 0 0 0 0 0 0 • 91 0 0 0 0 0 • 0 0 28 0 0 0
>> whos • Name Size Bytes Class • S 6x6 124 double array (sparse) • ans 6x6 288 double array • data 1x8 64 double array • ir 1x8 64 double array • jc 1x8 64 double array • Grand total is 68 elements using 604 bytes
2.1.3 数组和矩阵的访问 • 1.向量元素的访问 • 访问向量的元素只要使用相应元素的索引即可,以例说明 • 例1: A = [1 2 3 4 5 6 7 8 9 0],访问向量中的元素。 • 在MATLAB的命令行窗口中键入下面的指令: • >> %访问向量的第三个元素 • >> A(3) • ans = • 3
>> %访问向量的第一、三、七个元素 • >> A([1 3 7]) • ans = • 1 3 7 • >> %访问向量的第一、三、五个元素 • >> A([1,3,5]) • ans = • 1 3 5 • >> %访问向量的最后四个元素 • >> A([end-3:end]) • ans = • 7 8 9 0 • >> %重复访问向量中的元素 • >> A([1:5,5: -1:1]) • ans = • 1 2 3 4 5 5 4 3 2 1
说明: • 访问向量的元素直接给出元素在向量中的序号,元素的序号不仅可以是单一的整数,还可以是元素序号组成的向量,如例1中的各种操作。 • 关键字end在访问向量元素时,表示向量中最后一个元素的序号。 • 访问向量元素时,序号的数值必须介于数值1~end之间
例2 对向量A = [1 2 3 4 5 6 7 8 9 0]中的元素赋值 • 在MATLAB命令行窗口中键入下面的指令: • >> %对向量的第三个元素赋值 • >> A(3) = -3 • A = • 1 2 -3 4 5 6 7 8 9 0 • >> %对向量中不存在的数据赋值 • >> A(15) = -15 • A = • Columns 1 through 10 • 1 2 -3 4 5 6 7 8 9 0 • Columns 11 through 15 • 0 0 0 0 -15
说明: • 在例2中,对向量的第15个元素赋值,在赋值之前向量的第11~15个元素不存在,但是在赋值之后,将自动创建这些元素,并且为没有明确赋值的元素赋默认值0,这就是MATLAB的数据自动扩充和初始化机制。
2.矩阵元素的访问 • 访问矩阵的元素也需要使用矩阵元素的索引,不过具有两种方式,第一种方式是使用矩阵元素的行列全下标形式,第二种方法是使用矩阵元素的单下标形式 • 例3 : • MATLAB工作空间中具有一个5×5的矩阵,该矩阵是五阶的幻方,通过命令行获取矩阵的第二行、第四列的元素,于是在MATLAB命令行窗口中键入下面的指令:
>> %创建矩阵 • >> A = magic(5) • A = • 17 24 1 8 15 • 23 5 7 14 16 • 4 6 13 20 22 • 10 12 19 21 3 • 11 18 25 2 9 • >> %使用全下标的形式访问元素 • >> A(2,4) • ans = • 14 • >> %使用单下标的形式访问元素 • >> A(17) • ans = • 14
说明: • 使用了MATLAB函数magic创建幻方。所谓幻方,就是n阶的方阵,该方阵的行元素和列元素的和都相等。 • 使用全下标的形式访问矩阵元素的方法简单、直接,同线性代数的矩阵元素的概念一一对应。 • 矩阵元素的单下标是矩阵元素在内存中存储的序列号,一般地,同一个矩阵的元素存储在连续的内存单元中。 • 矩阵元素的单下标与全下标之间的转换关系如下,以m行的矩阵为例,该矩阵的第i行第j列的元素全下标表示为单下标l=(j-1)×m+i。 • 注意: • MATLAB的矩阵元素的排列以列元素优先,这一点同FORTRAN语言的二维数组元素的排列方法一致,与C语言的二维数组元素的排列不同,C语言的二维数组元素排列以行元素优先。
例4 用不同的方法访问矩阵的元素。 • 在MATLAB命令行中键入下面的指令: • >> % 创建矩阵 • >> A = 1:25; • >> A = reshape(A,5,5) • A = • 1 6 11 16 21 • 2 7 12 17 22 • 3 8 13 18 23 • 4 9 14 19 24 • 5 10 15 20 25
>> %访问矩阵的第三行第一列元素 • >> A(3,1)或A(3) • ans = • 3 • >> % 访问矩阵第三行的所有元素 • >> A(3,:) • ans = • 3 8 13 18 23 • >> %访问矩阵第四列的所有元素 • >> A(:,4) • ans = • 16 • 17 • 18 • 19 • 20
>> %访问矩阵的最后一行元素 • >> A(end,:) • ans = • 5 10 15 20 25 • >> %获取矩阵的子矩阵 • >> I = [1 3 5];J = [2 4]; • >> A(I,J) • ans = • 6 16 • 8 18 • 10 20
2.1.4 数组/矩阵操作 • 对数组或矩阵的基本操作有: • 插入 • 重新排列 • 提取 • 按列拉长 • 置空(去掉某行或某列) • 置零 • 用单个下标操作一个矩阵 • 用逻辑数组操作一个矩阵 • 按指定条件求子数组 • 求数组的规模
例1:X=4:6,按下列要求进行操作: • (1)插入:通过对x进行插入运算创建矩阵A • A=[x-3;x;x+3] • A = • 1 2 3 • 4 5 6 • 7 8 9 • (2)重新排列:以逆序重新排列A的各行形成矩阵B • B=A[3:-1:1,1:3] • B = • 7 8 9 • 4 5 6 • 1 2 3
(3)提取:提取A的前两行的后两列构成矩阵C • C=A[1:2,end-1:end](或C=A[1:2,2:3]) • C= • 2 3 • 5 6 • (4)按列拉长:对C按列拉长形成矩阵D • D=C(:) • D= • 2 • 5 • 3 • 6
(5)置空:删除B的第2列 • B(:,2)=[] • B= • 7 9 • 4 6 • 1 3 • (6)置零:将矩阵B的第2行第2列的元素置为0 • B(2,2)=0 • B= • 7 9 • 4 0 • 1 3
(7)用单个下标操作一个矩阵,获得矩阵B的第3个元素(7)用单个下标操作一个矩阵,获得矩阵B的第3个元素 • B(3) • ans= • 1 • (8)用逻辑数组操作一个矩阵:判断矩阵A中元素绝对值大于3的情况,如果绝对值大于3则置为1,否则为0 • abs(A)>3 • ans= • 0 0 0 • 1 1 1 • 1 1 1
(9)按指定条件求子数组:寻找A中大于4的元素对应的下标(9)按指定条件求子数组:寻找A中大于4的元素对应的下标 • [r,s]=find(A>4) • r= • 3 • 2 • 3 • 2 • 3 • s= • 1 • 2 • 2 • 3 • 3
(10)求数组的规模 • S=size(A),返回一个二元素行向量s,s的第一个元素是A的行数,第二个元素为A的列数 • [r,c]=size(A),返回两个变量r和c分别为A的行数和列数 • r=size(A,1),只返回A的行数给r • c=size(A,2),只返回A的列数给c • n=length(A),返回行数和列数中较大的一个
2.2 Matlab基本运算 • 2.2.1 数组和矩阵的基本运算 • 2.2.2逻辑运算和关系运算
2.2.1 数组和矩阵的基本运算 • 1. 数组操作函数 • 2. 矩阵生成函数 • 3. 数组和矩阵的运算符 • 4. 数组和矩阵的基本运算函数
3. 数组和矩阵运算符号 • 矩阵和数组运算是不同的,数组运算是元素对元素的运算,而矩阵运算采用线性代数的运算方式,两种运算符号也不同,其区别见下表