本节说明 MATLAB 中通过 A(行, 列) 访问或修改矩阵元素的方式。下标从 1 开始,与 C 语言、Python 等从 0 起算的约定不同;冒号表示该维上的全部下标;逻辑数组可作为下标,用于按条件筛选。整行、整列、子块与按条件赋值均建立在这套规则之上。
行在前,列在后
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, :) % 倒数第二行取子块
冒号范围或下标向量可以同时指定若干行与若干列,结果仍是矩阵:
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 20rows = [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 20scores = [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、逻辑索引及赋值方式。下一节介绍矩阵运算:加减、矩阵乘与数组乘、汇总函数及线性方程组左除。