当前位置: 主页 > 生物技术 > 软件工具与数据库 > 编程与数值计算

第二章 数值数组及其运算

2026-04-05 11:37 bioguider Internet 阅读 0
核心摘要: 内容概述 数值数组 Numeric Array 和数组运算 Array Operations 始终是MATLAB的核心内容 自MATLAB 5.x版起 由于其 面向对象 的特征 数值数组成为MATLA 关键词:第二章、数值数组及其运算

内容概述

 

数值数组(Numeric Array)和数组运算(Array Operations)始终是MATLAB的核心内容。自MATLAB 5.x版起,由于其"面向对象"的特征,数值数组成为MATLAB最重要的一种内建数据类型(Built-in Data Type),而数组运算就是定义在这种数据结构上的方法(Method)。

本章系统阐述:

 

  • 一、二维数值数组的创建、寻访

  • 数组运算和矩阵运算的区别

  • 实现数组运算的基本函数

  • 多项式的表达、创建和操作

  • 常用标准数组生成函数和数组构作技法

  • 高维数组的创建、寻访和操作

  • 非数NaN、"空"数组概念和应用

  • 关系和逻辑操作

补充说明

 

  1. 本章所涉内容和方法,不仅适用于数值数组,也将部分地延伸用于其他数据结构

  2. MATLAB 5.x和6.x版在本章内容上的差异极微

  3. MATLAB 6.5版新增的两种逻辑操作,在第2.13.2节介绍


2.1 引导

 

例2.1-1:绘制函数 y = x·e^(-x) 在 x ∈ [0,1] 时的曲线

matlab
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:子数组的寻访

matlab
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:子数组的赋值

matlab
x(3) = 0;             % 将第3个元素赋值为0
x([1 4]) = [1 1];     % 将第1、4个元素赋值为1

2.3 二维数组的创建

2.3.1 直接输入法

 

例2.3.1-1:创建二维数组C

matlab
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:复数数组的另一种输入方式

matlab
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文件

matlab
% 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的元素

matlab
A = zeros(2,5);
A(:) = -4:5;
L = abs(A) > 3;
X = A(L)

例2.4.3-2:演示逻辑数组与一般双精度数值数组的关系和区别


2.5 二维数组的子数组寻访和赋值

 

例2.5-1:不同赋值方式示例

matlab
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的数组运算性质

matlab
A = [1:4; 5:8];
pow2(A)               % 对每个元素进行2的幂运算

2.7 数组运算和矩阵运算

2.7.1 数组运算和矩阵运算指令对照汇总

 

例2.7.1-1:两种不同转置的比较

matlab
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的特征多项式

matlab
A = [11 12 13; 14 15 16; 17 18 19];
PA = poly(A);
PPA = poly2str(PA, 's')

例2.8.1.2-2:由给定根向量求多项式系数向量

matlab
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:求多项式的"商"及"余"

matlab
p1 = conv([1,0,2], conv([1,4],[1,1]));
p2 = [1 0 1 1];
[q, r] = deconv(p1, p2);

例2.8.2-2:两种多项式求值指令的差别

matlab
S = pascal(4);
P = poly(S);
PA = polyval(P, S);    % 数组求值
PM = polyvalm(P, S);   % 矩阵求值

例2.8.2-3:部分分式展开

matlab
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:标准数组产生的演示

matlab
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的使用演示

matlab
a = -4:4;
A = reshape(a, 3, 3);   % 改变数组形状
a1 = diag(A, 1);        % 提取上对角
A1 = diag(a1, -1);      % 构造下对角阵

例2.9.2-2:数组转置、对称交换和旋转操作

matlab
A.'                    % 转置
flipud(A)              % 上下翻转
fliplr(A)              % 左右翻转
rot90(A)               % 逆时针旋转90度

例2.9.2-3:演示Kronecker乘法不具备"可交换规律"

matlab
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:提取子数组,合成新数组

matlab
AB_BA = triu(A,1) + tril(A,-1)  % 提取上三角和下三角

例2.10-3:单下标寻访和reshape指令演示

matlab
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:"对列(或行)同加一个数"三种操作方法

matlab
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:逻辑函数的运用示例

matlab
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:"全下标"元素赋值方式创建高维数组

matlab
A(2,2,2) = 1;         % 创建三维数组
B(2,5,:) = 1:3;       % 沿第三维赋值

例2.11.1-2:低维数组合成高维数组

matlab
clear;
A(:,:,1) = ones(2,3);
A(:,:,2) = ones(2,3)*2;
A(:,:,3) = ones(2,3)*3;

例2.11.1-3:由函数直接创建标准高维数组

matlab
rand('state',1111);
rand(2,4,3)           % 2×4×3的三维随机数组

例2.11.1-4:借助cat, repmat, reshape等函数构作高维数组

matlab
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:维数、大小和长度

matlab
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的使用

matlab
A = reshape(1:18, 2, 3, 3);
flipdim(A, 1)         % 沿第一维翻转
flipdim(A, 3)         % 沿第三维翻转

例2.11.3-2:数组的"维序号左移"重组

matlab
shiftdim(A, 1)        % 维序号左移1位
shiftdim(A, 2)        % 维序号左移2位

例2.11.3-3:广义非共轭转置

matlab
permute(A, [2,3,1])   % 重排维度
permute(A, [1,3,2])

例2.11.3-4:"孤维"的撤消和降维

matlab
B = cat(4, A(:,:,1), A(:,:,2), A(:,:,3));
C = squeeze(B);       % 撤消孤维

例2.11.3-5:赋"空阵"值操作

matlab
A(:,2:3,:) = [];      % 删除指定位置

2.12 "非数"和"空"数组

2.12.1 非数NaN

 

例2.12.1-1:非数的产生和性质演示

matlab
a = 0/0;              % NaN产生
b = 0*log(0);
c = inf - inf;
isnan(a)              % 判断是否为NaN

例2.12.1-2:非数元素的寻访

matlab
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:关于"空"数组的算例

matlab
a = [];               % 空数组
b = ones(2,0);        % 2×0空矩阵
isempty(a)            % 判断是否为空

2.13 关系操作和逻辑操作

2.13.1 关系操作

 

例2.13.1-1:关系运算示例

matlab
A = 1:9;
B = 10 - A;
r0 = (A < 4);
r1 = (A == B);

例2.13.1-2:关系运算运用之一:求近似极限,修补图形缺口

matlab
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:逻辑操作示例

matlab
A = -3:3;
L1 = ~(A > 0);        % 注意运算符优先级
L2 = ~A > 0;
L3 = ~A;
L4 = A > -2 & A < 1;

例2.13.2-2:逻辑操作应用之一:逐段解析函数的计算和表现(削顶整流正弦半波)

matlab
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

2.13.3 关系、逻辑函数

    发表评论