本节说明 MATLAB 中二维数组(矩阵)的创建方式:方括号字面量、zeros / ones / eye / rand 等生成函数,以及横向与纵向拼接、cat、repmat 与转置。矩阵可视为多行向量按行叠放;行间用分号分隔,规则与向量一节一致。事先用 zeros 按最终尺寸占位,再向各位置写入,可避免循环中每次扩容带来的额外复制。

下列示例为 3×3 数值矩阵。同一行内用空格(或逗号)分隔元素,行与行之间用分号:

m = [1 2 3; 4 5 6; 7 8 9]
m =
     1     2     3
     4     5     6
     7     8     9

手写矩阵

  • 整体用方括号 [ ] 包住。
  • 同一行内元素以空格或逗号分隔。
  • 换行使用分号 ;,亦可在编辑器中直接回车换行,效果与分号相同。
m1 = [1 2 3; 4 5 6]
m2 = [1, 2, 3; 4, 5, 6]
m3 = [1 2 3
      4 5 6]

三种写法得到同一 2×3 矩阵。每一行的元素个数必须相同:[1 2 3; 4 5] 因第二行只有两个数,将报尺寸不一致错误。

zeros、ones、eye、rand

需要预分配全零阵、全一阵、单位阵或均匀随机矩阵时,宜使用内置函数,并显式给出尺寸,而不必逐个填写:

MATLAB 创建矩阵示例运行
zeros(3)     % 3×3 全 0
zeros(2,4)   % 2×4 全 0
ones(4,3)    % 4×3 全 1
eye(4)       % 4×4 单位阵
rand(3,5)    % 3×5,(0,1) 均匀随机

仅传入一个正整数时生成方阵;传入两个参数时依次为行数与列数。eye(n) 的主对角线为 1、其余为 0,常出现在线性代数记号中。

A = ones(2,3)
A =
     1     1     1
     1     1     1

循环写入结果时,应先写 Y = zeros(m, n) 再给 Y(i, j) 赋值。若从 [] 开始反复 [Y; 新行],数组会不断变长并整段复制,数据量大时明显变慢。zeros(m, n) 是指定尺寸的全零矩阵;空矩阵 [] 尺寸为 0×0,二者不是同一对象。函数页见 zeros、ones、eye。

拼接

方括号可将已有矩阵横向或纵向拼合。横向拼接要求行数相同,纵向拼接要求列数相同,否则将报错。

A = [1 2; 3 4];
B = [5 6; 7 8];
C = [A B]      % 横向 → 2×4
D = [A; B]     % 纵向 → 4×2

C 把 B 接到 A 的右侧;D 把 B 接到 A 的下方。若 A 为 2×2 而另一矩阵为 3×2,则 [A B] 因行数不同无法横向拼接。

E = cat(1, A, B)   % 沿第 1 维(行)拼,等同 [A; B]
F = cat(2, A, B)   % 沿第 2 维(列)拼,等同 [A B]
G = repmat(A, 2, 3)   % 将 A 按 2 行 3 列块平铺,得到 4×6

cat 的第一个参数是拼接所沿的维:1 表示增加行,2 表示增加列。repmat 则把同一块按网格重复,适合构造有周期结构的测试矩阵。详见 cat、repmat。

转置

A = [1 2 3; 4 5 6];
A'
ans =
     1     4
     2     5
     3     6

原来的第 1 行变成第 1 列。A' 对复数矩阵为共轭转置;若仅需交换行列、不要共轭,应使用 A.'。实数矩阵下两者结果相同。亦可调用 transpose。

注意事项

  • 每一行元素个数须相同,例如 [1 2 3; 4 5] 将报错。
  • 调用函数须写括号,例如 zeros(3),不能省略为 zeros 3。
  • zeros(m, n) 生成全零矩阵,空矩阵写作 [],二者含义不同。

本节说明了矩阵字面量、常用生成函数、拼接与转置的用法及尺寸约束。下一节介绍矩阵索引:行列下标、子块、diag 与逻辑索引。