内容概述
数值数组(Numeric Array)和数组运算(Array Operations)始终是MATLAB的核心内容。自MATLAB 5.x版起,由于其"面向对象"的特征,数值数组成为MATLAB最重要的一种内建数据类型(Built-in Data Type),而数组运算就是定义在这种数据结构上的方法(Method)。
本章系统阐述:
-
一、二维数值数组的创建、寻访
-
数组运算和矩阵运算的区别
-
实现数组运算的基本函数
-
多项式的表达、创建和操作
-
常用标准数组生成函数和数组构作技法
-
高维数组的创建、寻访和操作
-
非数NaN、"空"数组概念和应用
-
关系和逻辑操作
补充说明
-
本章所涉内容和方法,不仅适用于数值数组,也将部分地延伸用于其他数据结构
-
MATLAB 5.x和6.x版在本章内容上的差异极微
-
MATLAB 6.5版新增的两种逻辑操作,在第2.13.2节介绍
2.1 引导
例2.1-1:绘制函数 y = x·e^(-x) 在 x ∈ [0,1] 时的曲线
x = 0:0.1:1; y = x .* exp(-x); plot(x, y), xlabel('x'), ylabel('y'), title('y = x*exp(-x)')
-
图2.1-1
2.2 一维数组的创建和寻访
2.2.1 一维数组的创建
2.2.2 一维数组的子数组寻访和赋值
例2.2.2-1:子数组的寻访
rand('state',0); x = rand(1,5); % 产生1行5列的随机数组 x(3) % 寻访第3个元素 x([1 2 5]) % 寻访第1、2、5个元素 x(1:3) % 寻访第1到3个元素 x(3:end) % 寻访第3到最后一个元素 x(3:-1:1) % 寻访第3、2、1个元素(逆序) x(find(x > 0.5)) % 寻访大于0.5的元素
例2.2.2-2:子数组的赋值
x(3) = 0; % 将第3个元素赋值为0 x([1 4]) = [1 1]; % 将第1、4个元素赋值为1
2.3 二维数组的创建
2.3.1 直接输入法
例2.3.1-1:创建二维数组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]
例2.3.1-2:复数数组的另一种输入方式
M_r = [1,2,3; 4,5,6]; M_i = [11,12,13; 14,15,16]; CN = M_r + i*M_i
2.3.2 利用M文件创建和保存数组
例2.3.2-1:创建和保存数组AM的MyMatrix.m文件
% MyMatrix.m - Creation and preservation of matrix AM AM = [101,102,103,104,105,106,107,108,109;... 201,202,203,204,205,206,207,208,209;... 301,302,303,304,305,306,307,308,309];
2.4 二维数组元素的标识
2.4.1 "全下标"标识
2.4.2 "单下标"标识
2.4.3 "逻辑1"标识
例2.4.3-1:找出数组中所有绝对值大于3的元素
A = zeros(2,5); A(:) = -4:5; L = abs(A) > 3; X = A(L)
例2.4.3-2:演示逻辑数组与一般双精度数值数组的关系和区别
2.5 二维数组的子数组寻访和赋值
例2.5-1:不同赋值方式示例
A = zeros(2,4); A(:) = 1:8; % 按列填充 A([2 3 5]) = [10 20 30]'; % 单下标赋值 A(:,[2 3]) = ones(2); % 列赋值
2.6 执行数组运算的常用函数
2.6.1 函数数组运算规则的定义
2.6.2 执行数组运算的常用函数
例2.6.2-1:演示pow2的数组运算性质
A = [1:4; 5:8]; pow2(A) % 对每个元素进行2的幂运算
2.7 数组运算和矩阵运算
2.7.1 数组运算和矩阵运算指令对照汇总
例2.7.1-1:两种不同转置的比较
clear; A = zeros(2,3); A(:) = 1:6; A = A*(1+i); A_A = A.' % 数组转置(共轭转置) A_M = A' % 矩阵转置(共轭)
2.8 多项式的表达方式及其操作
2.8.1 多项式的表达和创建
-
一 多项式表达方式的约定
-
二 多项式行向量的创建方法
例2.8.1.2-1:求3阶方阵A的特征多项式
A = [11 12 13; 14 15 16; 17 18 19]; PA = poly(A); PPA = poly2str(PA, 's')
例2.8.1.2-2:由给定根向量求多项式系数向量
R = [-0.5, -0.3+0.4*i, -0.3-0.4*i]; P = poly(R); PR = real(P); PPR = poly2str(PR, 'x')
2.8.2 多项式运算函数
例2.8.2-1:求多项式的"商"及"余"
p1 = conv([1,0,2], conv([1,4],[1,1])); p2 = [1 0 1 1]; [q, r] = deconv(p1, p2);
例2.8.2-2:两种多项式求值指令的差别
S = pascal(4); P = poly(S); PA = polyval(P, S); % 数组求值 PM = polyvalm(P, S); % 矩阵求值
例2.8.2-3:部分分式展开
a = [1,3,4,2,7,2]; b = [3,2,5,4,6]; [r, s, k] = residue(b, a)
2.9 标准数组生成函数和数组操作函数
2.9.1 标准数组生成函数
例2.9.1-1:标准数组产生的演示
ones(1,2) % 全1数组 ones(2) % 2×2全1矩阵 randn('state',0); randn(2,3) % 正态分布随机数组 D = eye(3) % 单位阵 diag(D) % 提取对角元 diag(diag(D)) % 对角阵 repmat(D,1,3) % 数组复制扩展
2.9.2 数组操作函数
例2.9.2-1:diag与reshape的使用演示
a = -4:4; A = reshape(a, 3, 3); % 改变数组形状 a1 = diag(A, 1); % 提取上对角 A1 = diag(a1, -1); % 构造下对角阵
例2.9.2-2:数组转置、对称交换和旋转操作
A.' % 转置 flipud(A) % 上下翻转 fliplr(A) % 左右翻转 rot90(A) % 逆时针旋转90度
例2.9.2-3:演示Kronecker乘法不具备"可交换规律"
B = eye(2); C = reshape(1:4, 2, 2); kron(B, C) % Kronecker张量积 kron(C, B)
2.10 数组构作技法综合
例2.10-1:数组的扩展
-
(1)数组的赋值扩展法
-
(2)多次寻访扩展法
-
(3)合成扩展法
例2.10-2:提取子数组,合成新数组
AB_BA = triu(A,1) + tril(A,-1) % 提取上三角和下三角
例2.10-3:单下标寻访和reshape指令演示
A = reshape(1:16, 2, 8); reshape(A, 4, 4); s = [1 3 6 8 9 11 14 16]; A(s) = 0;
例2.10-4:"对列(或行)同加一个数"三种操作方法
A_b1 = A - b([1 1 1], :); % 方法1:扩展矩阵 A_b2 = A - repmat(b, 3, 1); % 方法2:repmat扩展 A_b3 = [A(:,1)-b(1), A(:,2)-b(2), A(:,3)-b(3)]; % 方法3:逐列操作
例2.10-5:逻辑函数的运用示例
randn('state',1); R = randn(3,6); L = abs(R)<0.5 | abs(R)>1.5; % 逻辑条件 R(L) = 0; % 符合条件的元素赋0 [ii, jj] = find(R == 111); % 查找特定值的位置
2.11 高维数组
2.11.1 高维数组的创建
例2.11.1-1:"全下标"元素赋值方式创建高维数组
A(2,2,2) = 1; % 创建三维数组 B(2,5,:) = 1:3; % 沿第三维赋值
例2.11.1-2:低维数组合成高维数组
clear; A(:,:,1) = ones(2,3); A(:,:,2) = ones(2,3)*2; A(:,:,3) = ones(2,3)*3;
例2.11.1-3:由函数直接创建标准高维数组
rand('state',1111); rand(2,4,3) % 2×4×3的三维随机数组
例2.11.1-4:借助cat, repmat, reshape等函数构作高维数组
cat(3, ones(2,3), ones(2,3)*2, ones(2,3)*3) % 沿第三维连接 repmat(ones(2,3), [1,1,3]) % 复制扩展 reshape(1:12, 2, 2, 3) % 变形为三维
2.11.2 高维数组的标识
例2.11.2-1:维数、大小和长度
clear; A = reshape(1:24, 2, 3, 4); dim_A = ndims(A) % 维数 size_A = size(A) % 各维大小 L_A = length(A) % 最长维的长度
2.11.3 高维数组构作和操作函数汇总
例2.11.3-1:数组元素对称交换指令flipdim的使用
A = reshape(1:18, 2, 3, 3); flipdim(A, 1) % 沿第一维翻转 flipdim(A, 3) % 沿第三维翻转
例2.11.3-2:数组的"维序号左移"重组
shiftdim(A, 1) % 维序号左移1位 shiftdim(A, 2) % 维序号左移2位
例2.11.3-3:广义非共轭转置
permute(A, [2,3,1]) % 重排维度 permute(A, [1,3,2])
例2.11.3-4:"孤维"的撤消和降维
B = cat(4, A(:,:,1), A(:,:,2), A(:,:,3)); C = squeeze(B); % 撤消孤维
例2.11.3-5:赋"空阵"值操作
A(:,2:3,:) = []; % 删除指定位置
2.12 "非数"和"空"数组
2.12.1 非数NaN
例2.12.1-1:非数的产生和性质演示
a = 0/0; % NaN产生 b = 0*log(0); c = inf - inf; isnan(a) % 判断是否为NaN
例2.12.1-2:非数元素的寻访
rand('state',0); R = rand(2,5); R(1,5) = NaN; R(2,3) = NaN; isnan(R) % 返回逻辑数组 find(isnan(R)) % 找出NaN的位置
2.12.2 "空"数组
例2.12.2-1:关于"空"数组的算例
a = []; % 空数组 b = ones(2,0); % 2×0空矩阵 isempty(a) % 判断是否为空
2.13 关系操作和逻辑操作
2.13.1 关系操作
例2.13.1-1:关系运算示例
A = 1:9; B = 10 - A; r0 = (A < 4); r1 = (A == B);
例2.13.1-2:关系运算运用之一:求近似极限,修补图形缺口
t = -2*pi:pi/10:2*pi; y = sin(t)./t; tt = t + (t==0)*eps; % 修补零点 yy = sin(tt)./tt;
-
图2.13-1 极限处理前后的图形对照
2.13.2 逻辑操作
例2.13.2-1:逻辑操作示例
A = -3:3; L1 = ~(A > 0); % 注意运算符优先级 L2 = ~A > 0; L3 = ~A; L4 = A > -2 & A < 1;
例2.13.2-2:逻辑操作应用之一:逐段解析函数的计算和表现(削顶整流正弦半波)
t = linspace(0, 3*pi, 500); y = sin(t); z1 = ((t<pi) | (t>2*pi)) .* y; z2 = w*sin(pi/3) + w_n.*z1;
-
图2.13-2
-
图2.13-3