Skip to content

MATLAB - 矩阵

在 MATLAB 中,基本数据类型是数组(array)。矩阵(matrix)只是二维数组的一种形式,但 MATLAB 的功能支持任意维度的数组。理解如何创建、操作和访问数组数据是任何 MATLAB 用户最重要的技能。

你可以通过输入每行的元素来创建矩阵,元素之间用逗号或空格分隔,并使用分号(;)标记每行的结束。所有元素都用方括号 [] 括起来。

例如,我们来创建一个 4x5 的矩阵 A:

% 行末的分号会抑制输出显示。
A = [1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
% 要显示矩阵,直接输入其名称即可:
A

MATLAB 将执行以上语句并返回以下结果:

A =
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

手动创建大型矩阵非常繁琐。MATLAB 提供了用于生成常见类型矩阵的函数:

% 创建一个 3x3 的全零矩阵
Z = zeros(3, 3);
% 创建一个 2x4 的全一矩阵
O = ones(2, 4);
% 创建一个 4x4 的单位矩阵(对角线上为 1)
I = eye(4);
% 创建一个 3x5 的均匀分布随机数矩阵
R = rand(3, 5);
% 创建一个 3x5 的正态分布随机数矩阵
N = randn(3, 5);

索引是你从数组中选择特定元素的方式。MATLAB 是一种基于 1 的索引语言,这意味着第一个元素位于索引 1,而不是 0。

要引用矩阵 A 中第 m 行和第 n 列的元素,你使用 A(m, n) 语法。

% 让我们使用之前定义的矩阵 A
A = [1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
% 获取第 2 行、第 5 列的元素
element = A(2, 5)

MATLAB 将返回:

element = 6

冒号运算符 : 功能极其强大。它可用于选择整行、整列或一个范围。

% 获取第 4 列的所有元素
col_4 = A(:, 4);
% 获取第 3 行的所有元素
row_3 = A(3, :);
% 获取第 2-3 行、第 2-4 列的子矩阵
submatrix = A(2:3, 2:4);
% 获取从第 3 列到末尾的所有元素
last_cols = A(:, 3:end); % 'end' 是表示最后一个索引的关键字

submatrix 示例将产生:

submatrix =
3 4 5
4 5 6

逻辑索引是一种高效且可读性强的技术。你创建一个与数据大小相同的逻辑数组(包含 true 和 false 值),并用它来选择索引为 true 的元素。

% 查找矩阵 A 中所有大于 5 的元素
large_values = A(A > 5)
% 这将返回满足条件的列向量。
% 你也可以用它来修改值
% 将所有奇数替换为 0
A_modified = A;
% rem(A, 2) == 1 为奇数创建了一个逻辑掩码
A_modified(rem(A_modified, 2) == 1) = 0;

你可以通过将空数组 [] 赋给整行或整列来删除它。

% 创建矩阵的一个新副本
A_temp = [1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
% 删除第 4 行
A_temp(4, :) = [];
% 现在 A_temp 是一个 3x5 矩阵。
% 删除第 5 列
A_temp(:, 5) = [];
% 现在 A_temp 是一个 3x4 矩阵。

你可以通过连接较小的矩阵来构建更大的矩阵。让我们通过复制并堆叠现有矩阵的第二行和第三行来创建一个 4x3 的矩阵。

% 原始 3x3 矩阵
a = [1 2 3; 4 5 6; 7 8 9];
% 我们需要第 2 行和第 3 行,然后再次是第 2 行和第 3 行
% 创建我们想要的行索引向量
index_vector = [2, 3, 2, 3];
% 使用这个向量来创建新矩阵
new_mat = a(index_vector, :)

结果是按指定顺序构造的新矩阵:

new_mat =
4 5 6
7 8 9
4 5 6
7 8 9

这里是对基本矩阵运算的简要概述。一个关键概念是矩阵运算(遵循线性代数规则)和逐元素运算(独立地对每个元素应用操作)之间的区别。

  • 加法和减法(+,-):这些始终是逐元素的。矩阵必须具有相同的维度。C = A + B
  • 矩阵乘法(*):遵循线性代数规则。第一个矩阵的列数必须等于第二个矩阵的行数。C = A * B
  • 逐元素乘法(.*):对应元素相乘。矩阵必须具有相同的维度。C = A .* B
  • 矩阵除法(\,/):求解线性方程组。x = A\b 是求解 A*x = b 更健壮的方法。
  • 逐元素除法(./):对应元素相除。C = A ./ B
  • 转置('):将矩阵沿其对角线翻转。B = A'
  • 行列式(det):从方阵计算出的标量值。d = det(A)
  • 逆(inv):对于方阵 A,其逆矩阵 B 使得 A*B 是单位矩阵。B = inv(A)。注意:对于求解方程,使用 inv 通常不如使用反斜杠运算符(\)精确和快速。

预分配:如果你知道在循环中构建的矩阵的最终大小,请在循环之前使用 zeros() 或 ones() 进行预分配。这比在每次迭代中增长数组要快得多。

现代数据结构:对于混合数据(数字、文本、类别),请考虑使用 table 或 timetable 对象。它们提供命名列,并且比纯数值矩阵在数据分析任务中更灵活。