MATLAB - 矩阵
MATLAB - 矩阵和数组
Section titled “MATLAB - 矩阵和数组”在 MATLAB 中,基本数据类型是数组(array)。矩阵(matrix)只是二维数组的一种形式,但 MATLAB 的功能支持任意维度的数组。理解如何创建、操作和访问数组数据是任何 MATLAB 用户最重要的技能。
创建矩阵和数组
Section titled “创建矩阵和数组”你可以通过输入每行的元素来创建矩阵,元素之间用逗号或空格分隔,并使用分号(;)标记每行的结束。所有元素都用方括号 [] 括起来。
例如,我们来创建一个 4x5 的矩阵 A:
% 行末的分号会抑制输出显示。A = [1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
% 要显示矩阵,直接输入其名称即可:AMATLAB 将执行以上语句并返回以下结果:
A =
1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8使用内置函数创建数组
Section titled “使用内置函数创建数组”手动创建大型矩阵非常繁琐。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);索引:访问数组元素
Section titled “索引:访问数组元素”索引是你从数组中选择特定元素的方式。MATLAB 是一种基于 1 的索引语言,这意味着第一个元素位于索引 1,而不是 0。
下标索引(行、列)
Section titled “下标索引(行、列)”要引用矩阵 A 中第 m 行和第 n 列的元素,你使用 A(m, n) 语法。
% 让我们使用之前定义的矩阵 AA = [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使用冒号运算符 (:) 进行切片
Section titled “使用冒号运算符 (:) 进行切片”冒号运算符 : 功能极其强大。它可用于选择整行、整列或一个范围。
% 获取第 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逻辑索引(现代方法)
Section titled “逻辑索引(现代方法)”逻辑索引是一种高效且可读性强的技术。你创建一个与数据大小相同的逻辑数组(包含 true 和 false 值),并用它来选择索引为 true 的元素。
% 查找矩阵 A 中所有大于 5 的元素large_values = A(A > 5)
% 这将返回满足条件的列向量。
% 你也可以用它来修改值% 将所有奇数替换为 0A_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 矩阵。示例:连接和重塑
Section titled “示例:连接和重塑”你可以通过连接较小的矩阵来构建更大的矩阵。让我们通过复制并堆叠现有矩阵的第二行和第三行来创建一个 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核心矩阵运算
Section titled “核心矩阵运算”这里是对基本矩阵运算的简要概述。一个关键概念是矩阵运算(遵循线性代数规则)和逐元素运算(独立地对每个元素应用操作)之间的区别。
- 加法和减法(
+,-):这些始终是逐元素的。矩阵必须具有相同的维度。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通常不如使用反斜杠运算符(\)精确和快速。
最佳实践和进阶学习
Section titled “最佳实践和进阶学习”预分配:如果你知道在循环中构建的矩阵的最终大小,请在循环之前使用 zeros() 或 ones() 进行预分配。这比在每次迭代中增长数组要快得多。
现代数据结构:对于混合数据(数字、文本、类别),请考虑使用 table 或 timetable 对象。它们提供命名列,并且比纯数值矩阵在数据分析任务中更灵活。