本节说明 MATLAB 中通过 A(行, 列) 访问或修改矩阵元素的方式。下标从 1 开始,与 C 语言、Python 等从 0 起算的约定不同;冒号表示该维上的全部下标;逻辑数组可作为下标,用于按条件筛选。整行、整列、子块与按条件赋值均建立在这套规则之上。

行在前,列在后

行↓ 列1 列2 列3 行1 行2 行3 1 2 3 4 5 6 7 8 9 A(2,3):第 2 行与第 3 列的交叉处 → 6
行列均从 1 编号:A(2,3) 表示第 2 行、第 3 列。A(2,:) 取整行,A(:,3) 取整列。
A = [1 2 3; 4 5 6; 7 8 9];
A(2, 3)    % 第 2 行第 3 列 → 6

第一个下标是行,第二个是列。写成 A(3, 2) 得到的是第 3 行第 2 列的 8,与 A(2, 3) 不是同一位置。

冒号 : 表示该方向上的全部下标;end 表示该方向上的最后一个下标,无需事先查询行数或列数:

A(2, :)       % 第 2 行 → 4 5 6
A(:, 3)       % 第 3 列 → 3; 6; 9
A(end, end)   % 右下角 → 9
A(end-1, :)   % 倒数第二行

取子块

冒号范围或下标向量可以同时指定若干行与若干列,结果仍是矩阵:

MATLAB 矩阵索引示例运行
A = [1 2 3; 4 5 6; 7 8 9];
disp(A(2, 3))
disp(A(2, :))
disp(A(1:2, 2:3))
v = [5 12 3 8 20];
disp(v(v > 8))
6
   4   5   6
   2   3
   5   6
   12   20
rows = [1 3];
A(rows, :)     % 第 1 行与第 3 行,跳过第 2 行

A(1:2, 2:3) 取第 1~2 行与第 2~3 列交叉形成的 2×2 子块。下标向量不必连续,也可按任意顺序重排行或列。

对角线:diag

D = diag([10 20 30])   % 向量 → 对角矩阵
d = diag(A)            % 矩阵 → 主对角线元素
d =
     1
     5
     9

传入向量时生成以该向量为对角线、其余为 0 的方阵;传入矩阵时提取主对角线。同一函数名在两个方向上含义不同,须看输入是向量还是矩阵。

逻辑索引

关系运算产生与原数组同尺寸的逻辑数组,真值位置对应的元素被选出,结果一般排成向量:

v = [5 12 3 8 20];
v(v > 8)     % 12 20
scores = [62 88 45 91 70];
passed = scores(scores >= 60)

v > 8 得到五个逻辑值,其中第 2、第 5 个为真,因而取出 12 与 20。条件与被索引数组的尺寸须对应;对矩阵使用逻辑索引时,选出的元素按列优先顺序排成一列。

用索引赋值

圆括号出现在赋值号左侧时,表示改写指定位置,而不是取出副本:

A = [1 2 3; 4 5 6; 7 8 9];
A(2, 3) = 100;     % 只改 A(2,3)
A(:, 1) = 0;       % 整列改写
A(A > 10) = -1;    % 所有大于 10 的元素改为 -1

最后一行按条件批量赋值:凡大于 10 的元素(含刚才写入的 100)都改成 -1。右侧若写标量,该标量会填入所有被选中的位置。

常见误区

  • 下标从 1 起,不是从 0 起;A(0, 1) 非法。
  • 书写 A(i, j) 时须明确第一个下标为行、第二个为列。
  • 逻辑索引中,条件数组与被索引数组的尺寸须对应;否则可能报错或得到非预期结果。
  • 只写一个下标时,MATLAB 按列优先把矩阵看成一条长向量,A(5) 在 3×3 中对应第 2 列第 2 个元素(值为 5),与 A(2, 2) 相同。入门阶段建议始终写清两个下标。

本节说明了行列下标、冒号取整行整列、子块与 diag、逻辑索引及赋值方式。下一节介绍矩阵运算:加减、矩阵乘与数组乘、汇总函数及线性方程组左除。