1.25k likes | 1.4k Views
二维数值数组及其应用. 一、二维数组简介 二、创建二维数组 三、二维数组的访问(引用)和赋值 四、数组运算 五、二维数组操作函数 六、与数组相关的函数 七、二维数组在绘图中的应用 八、二维数组在线性代数中的应用. 一、二维数组简介. 二维数组( array )是由实数或复数排列成矩形而构成的,从数据结构上看,二维数组和矩阵没有什么区别。当二维数组带有线性变换含义时,该二维数组就是矩阵( matrix )。. 1 、二维数组与矩阵. 2 、标量、向量、矩阵都是二维数组.
E N D
二维数值数组及其应用 一、二维数组简介 二、创建二维数组 三、二维数组的访问(引用)和赋值 四、数组运算 五、二维数组操作函数 六、与数组相关的函数 七、二维数组在绘图中的应用 八、二维数组在线性代数中的应用
一、二维数组简介 二维数组(array)是由实数或复数排列成矩形而构成的,从数据结构上看,二维数组和矩阵没有什么区别。当二维数组带有线性变换含义时,该二维数组就是矩阵(matrix)。 1、二维数组与矩阵
2、标量、向量、矩阵都是二维数组 一个数,称为标量(scalor),在Matlab中看作为 1 X 1 二维数组(矩阵) n个元素排成一行,称为行向量(row vector),在Maltab中被看作为 1 X n 二维数组(矩阵) n个元素排成一列,称为列向量(column vector),在Matlab中看作为 n X1 二维数组(矩阵) 在Matlab中提到向量,一般都是指的列向量
(1)在键盘上输入下列内容 A = [1,2,3; 4,5,6; 7,8,9] (2)按【Enter】键,指令被执行。 (3)在指令执行后,MATLAB指令窗中将显示以下结果: A = 1 2 3 4 5 6 7 8 9 二、创建二维数组 1、用方括号[ ]创建二维数组 说明:输入二维数组时,每行元素用逗号分隔,行与行之间用分号分隔,整个二维数组放在方括号[ ]里,标点符号一定要在英文状态下输入。二维数组一般用大写字母表示。
2、用方括号[ ]由一维数组创建二维数组 a = [1,3,5] b = [2,4,6] c = [3,5,7] D = [a;b] E = [b;c] F = [D,E] G = [a’,b’,c’] H = [G;G]
列向量 行向量 二维数组 列× 行= 二维数组 4、利用矩阵乘法由一维数组创建二维数组 x = linspace(0,2*pi) x = x’ y = [1,2,3] C = x*y
5、根据数组元素的规律,用matlab脚本创建二维数组5、根据数组元素的规律,用matlab脚本创建二维数组 A = zeros(n,n) for i = 1:n for j = 1:n A(i,j) = 1/(i+j-1); end end 希尔伯特矩阵是高度病态的,即任何一个元素发生一点变动,整个矩阵的值和逆矩阵都会发生巨大变化,病态程度和阶数相关。
练习:在matlab中生成如下的二维数组 A = 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 B = 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 4 -4 0 0 0 0 -3 0 0 0 0 -2 0 0 0 0 -1
三、二维数组的数组运算 1、二维数组的转置运算 A.’ A’ 对A做转置(行→列,列→行) 对A做共轭转置 若A的元素均为实数,则A.’与A’的结果相同 B = A.’ 对数组A做转置运算,将运算结果赋值给变量B,内存中数组A的内容并没有任何变化。
2、两个维数相同的二维数组之间的数学运算 运算结果为与A、B同维的数组 • A + B:加,对应位置的数组元素相加 • A - B:减,对应位置的数组元素相减 • A.*B:点乘,对应位置的数组元素相乘 • A./B:右点除,对应位置的数组元素相除 • A.\B:左点除 • A.^B:点幂,对应位置的数组元素做幂运算
3、二维数组与标量的之间的数组运算 A + c :A的每个元素加c A - c: A的每个元素减c A.*c 或 A*c:A的每个元素乘c, A./c 或 A/c: A的每个元素除以c A.\c 或 A\c:c除以A的每个元素 A.^c:点幂, A的每个元素做幂运算 c.^A:点幂,c做幂运算 运算结果为与A同维的数组
练习:试写出下列matlab语句的输出结果,并在matlab中进行验证。练习:试写出下列matlab语句的输出结果,并在matlab中进行验证。 A = ones(3) B = eye(3) C = zeros(3) D = (A+B).*(A-B) E = (D + 1) + (D - 1)*i F = E.’./E’ + E.’.\E’ G = B.^D + D.^B
4、二维数组的关系运算 一个二维数组可以与另一个同维的数组,或一个标量进行关系运算,返回一个由0和1组成的同维的“逻辑数组” 。
5、二维数组的逻辑运算 一个二维数组可以与另一个同维的数组,或一个标量进行逻辑运算,返回一个由0和1组成的同维的“逻辑数组” 任何非 0 实数都被看作是“逻辑真”(true),只有 0 才被认为是“逻辑假”(false)。
6、函数作用在二维数组上的运算规则 Matlab中的很多函数都可以直接以数组作为输入参数,函数输出也为数组。 输入为二维数组, 输出也为二维数组
7、二维数组用做for循环的循环变量 forx = array statement (循环体) end x 为循环变量,数组 array 的列数决定 for 循环的次数。每次循环,x依次取数组array 的一列 s1 = 0; for x = [1,2,3,4] s1 = s1 + x; end s2 = 0; for x = [1,2;3,4] s2 = s2 + x; end s1 = ? s2 = ?
8、二维数组用于 if 结构的条件表达式 ifexpression statements end 一般情况下,表达式 expression 都是标量,但也允许为数组,此时只有数组元素都为逻辑真时,statements才被执行。如果表达式为空数组,被认为是假。 a = [0,1;2,3]; b = 1:3; if a b = b.^2; else b = 2.^b; end a = [0,1;2,3]; b = 1:3; if a-0.1 b = b.^2; else b = 2.^b; end b = ? b = ?
1、二维数组单个元素的访问和赋值 四、二维数组的访问(引用)和赋值 (1)A(r,c)全下标 A =[1:3;2:2:6;3:3:9] a = A(2,3) b = A(1,end) A(3,2) = 0 A(end,1) = A(end,end) 指出是“第几行,第几列”的元素 (2) A(ind)单下标(Linear Index) 只用一个下标来指明元素在数组中的位置:把二维数组的所有列,按先左后右的次序,首尾相接排成“一维长列”,然后,自上往下对元素位置进行标号。 c = A(7) d = A(end) A(end) = c+d
(3) 二维数组扩展大小 A = 1 0 0 7 0 1 0 0 0 0 1 0 A = 1 0 0 0 1 0 0 0 1 A =eye(3) A(1,4) = 7 B =eye(3) B(10) = 7 B = 1 0 0 0 1 0 0 0 1 In an assignment A(I) = B, a matrix A cannot be resized. 使用单下标,无法扩展二维数组!
(4)“单下标”与“全下标”的转化: ind = sub2ind(siz,r,c) 全下标→单下标 [r,c] = ind2sub(siz,ind) 单下标→全下标 A =eye(4,5) ind = sub2ind(size(A),2,3) [a, b] = ind2sub(size(A),19)
2、二维数组的子数组 的引用和赋值 (1)使用“双下标”方式 A =eye(5,6) B1 = A(2,:) C1 = A([2,2],:) D1 = A([1,2,4],:) E1 = A(1:2:end,:) B2 = A(:,2) C2 = A(:,[2,2]) D2 = A(:,[1,2,4]) E2 = A(:,1:2:end) B3 = A([2,3],[3,2]) C3 = A([1,2,1],[2,2,3]) D3 = A([1,3,5],[1,2,4]) E3 = A(:,:)
(3) 使用 “ 逻辑索引 ” 逻辑索引:通过逻辑数组中“逻辑1”所在的位置,指出数组中元素的的位置,从而可以对数组中的元素(子数组)进行访问或赋值。 逻辑数组的元素个数应等于或小于 被索引的数组的元素个数,一般情况下,两者维数应相同。 x = 1:10 L = logical([0 1 0 1]) a = x(L) A = [80:100;180:200] B = rem(A,7) L = B==0 Result = A(L) 返回二维数组A中的能被7整除的数。 二维数组使用逻辑索引,返回结果为列。
(4) 使用find( ) 函数 ind = find(X) 找出数组X中的所有非零的元素的位置,并且在向量ind中返回非零元素的线性索引(单下标)。如果X是一个行向量,则ind也是一个行向量,否则,ind是一个列向量。如果X没有非零元素或者是空数组,则ind为空数组。 ind = find(X, k) 或ind = find(X, k, 'first') 返回数组X中所有非零元素的前k个元素的索引值,k必须为正整数。 ind = find(X, k, ‘last’) 返回数组X中所有非零元素的后k个元素的索引值。 [row,col] = find(X, ...)返回矩阵 X 中非零元素的双下标索引,行索引返回至 row,列索引返回至 col [row,col,v] = find(X, ...)返回 X 中非零元素组成的向量 v,以及相应的行、列索引(双下标)。如果X是一个逻辑式,则v是一个逻辑数组。输出v包含表达式X计算出的逻辑数组的非零值。
find( ) 函数举例 A = 0 3 0 0 0 5 0 0 0 k = 4 8 A = diag([3,5],1) k = find(A) [r,c,v] = find(A) A(k) A(find(A)) s = find(A>4) [a,b,c] = find(A>4) A(s) A(find(A>4)) r = 1 2 c = 2 3 v = 3 5 A(k)的输出是什么? A(find(A)) 的输出是什么? s,a,b,c的输出是什么
(5) 二维数组子数组 引用 / 赋值 应用举例 矩阵初等变换 Matlab中:A([i,j],:) = A([j,i],:) Matlab中:A(i,:) = k*A(i,:) Matlab中:A(i,:) =A(i,:) + k*A(j,:)
~ ~ ~ 1 1 2 1 4 ~ ~ 0 1 1 1 0 0 0 0 1 3 0 00 0 0 练习:用matlab实现下面的矩阵初等变换 r1r2 1 1 2 1 4 r32 2 1 1 1 2 2 3 1 1 2 3 6 9 7 9 r2r3 r22 1 1 2 1 4 1 1 2 1 4 r32r1 r35r2 0 2 2 2 0 0 1 1 1 0 0 5 5 3 6 0 0 0 2 6 r43r1 r43r2 0 3 3 4 3 0 00 1 3 r3r4 r1r2 1 0 1 0 4 r42r3 r2r3 0 1 1 0 3 0 0 0 1 3 0 00 2 6 0 00 0 0 行阶梯形矩阵 行最简形矩阵
练习:试写出下列matlab语句的输出结果,并在matlab中进行验证。练习:试写出下列matlab语句的输出结果,并在matlab中进行验证。 a = 1:12 B = reshape(a,3,4) C = rot90(B) d = diag(C) E = diag(d) F = [tril(B);triu(B)] G = cat(2,tril(C),triu(C)) H = repmat(a,4,1) I = flipud(G) J = kron(d,E)
六、与二维数组相关的函数 当输入参数 A 为二维数组时: cmax = max(A) 返回cmax为一个行数组,元素为A的每个列的最大值 rmax = max(A,[],2) 返回rmax为一个列数组,元素为A的每个行的最大值 返回A中每个列的最大值及其位置, cmax,index为行数组 [cmax,index] = max(A) 返回A中每个行的最大值及其位置,rmax,index为列数组 [rmax,index] = max(A,[],2) max(A,B) 返回一个二维数组,元素为A,B相同位置上的较大值 函数 min( )与函数 max( )的用法相同
dim=1,列 dim=2,行
返回逻辑值的一些函数: (1) logical( ) : 将数值型数据转换为逻辑型数据 L = logical(A) 输入A为实数数组,返回值L为一个与A同维的逻辑数组,当A中的元素为非零元素时,L中对应的位置返回逻辑1,否则返回逻辑0。 注意:A中的元素不能为复数或 NaN A = eye(3) L = logical(A) M = L + 0 A = 1.00 0 0 0 1.00 0 0 0 1.00 L = 1 0 0 0 1 0 0 0 1 逻辑型数据参与数值运算,即会转换为数值型数据。故M就不是逻辑数组了,而是双精度数值数组。
(2) ture( ) 和 false( ):创建逻辑类型的数据 用ture( )和false( )函数可以创建逻辑类型的数据 true: 即 logical (1)true(n): 逻辑1组成的n×n二维数组true(m, n) :逻辑1组成的m×n二维数组true([m, n]) :与 true(m, n) 功能相同true(size(A)):与数组A维数相同的值为逻辑1数组 false 的用法与 true 相同
(3) 逻辑函数:all( ) 和 any( ) 任何非 0 数都被看作是“真”,只有 0 才被认为是“假”。 A = [1,2,3;0,4,6] a = all(A) b = any(A) c = all(a) d = all(b) a = 0 1 1 b = 1 1 1 c = 0 d = 1
(4) is* 系列测试函数: 返回逻辑类型数据 doc is*可以在matlab的help中查看到所有的测试函数
绘制第n条曲线 绘制第1条曲线 七、二维数组在绘图中的应用 1、利用二维数组绘制2D图形 plot(X,Y):当 X, Y 是维数相同的实数二维数组时,将 X 的列和 Y 相应的列相组合,绘制多条平面曲线。 当 X, Y 是复数数组时, 忽略虚部,等效于: plot(real(X),real(Y))
plot(x,Y) x是一维数组, Y 是二维数组 若 x 的长度与 Y 的行数相等,则将 x 与 Y 中的各列相对应,绘制多条平面曲线; 若 x 的长度与 Y 的列数相等,则将 x 与 Y 中的各行相对应,绘制多条平面曲线。 plot(X,y) X是二维数组, y 是一维数组 若 y 的长度与 X 的行数相等,则将 X 中的各列与 y 相对应,绘制多条平面曲线; 若 y 的长度与 X 的列数相等,则将 X 中的各行与 y 相对应,绘制多条平面曲线。
plot(Y) 当Y 是实数一维数组时,等价于: x = 1:length(Y) plot(x,Y) 当Y 是实数二维数组时,等价于: x = 1:size(Y,1) plot(x,Y) 当Y为复数数组时,等价于: plot(real(Y),imag(Y))
x = 0:0.1:2*pi X = [x; x; x ] Y = [cos(x);2*cos(x);3*cos(x)] plot(X,Y) 为什么是这样的? x = 0:0.1:2*pi X = [x, x, x ] Y = [cos(x),2*cos(x),3*cos(x)] plot(X,Y) 图形是什么样的,能分析一下吗? x = 0:0.1:2*pi x = x' X = [x, x, x ] Y = [cos(x),2*cos(x),3*cos(x)] plot(X,Y) 为什么现在对了?
例:利用矩阵乘法生成绘图数据,并绘制图形:例:利用矩阵乘法生成绘图数据,并绘制图形: n = 9 x = linspace(0,2*pi,50) y = cos(x)’*(1:n) plot(x,y) 线性代数中: 列 × 行 = 矩阵
2、利用二维数组绘制3d图形 (1) 利用二维数组绘制三维曲线: plot3( ) plot3(X,Y,Z)的用法与plot(X,Y)类似,只是多了一个 Z 数组。 当X,Y,Z为同维的一维数组时,plot3( )依次以 X 、Y、Z 数组中的的第k个元素X(k),Y(k),Z(k)作为第k个点的直角坐标值(X(k),Y(k),Z(k)),描点连线,绘制出三维空间中的一条3d曲线。 t=[0:0.2:10*pi]; x=2*t; y=sin(t); z=cos(t); plot3(x,y,z,'bo'); hold on plot3(x,y,z,'r-','LineWidth',2)