MATLAB - 数组乘法
MATLAB - 数组运算:逐元素乘法 vs. 矩阵乘法
Section titled “MATLAB - 数组运算:逐元素乘法 vs. 矩阵乘法”在 MATLAB 中,“乘法”一词可以有两种截然不同的含义,理解其区别对于正确高效地编写代码至关重要。我们区分逐元素乘法(element-wise multiplication),它作用于数组的对应元素,以及矩阵乘法(matrix multiplication),它遵循线性代数的规则。
逐元素乘法:点运算符(.*)
Section titled “逐元素乘法:点运算符(.*)”当您希望将两个数组的对应元素相乘时,请使用逐元素乘法。这常用于数据缩放、将公式应用于数据集或处理非线性方程。
% 点星号运算符X = A .* B
% 等效的函数调用(在脚本中不常用)X = times(A, B)为了使 A .* B 正常工作,数组 A 和 B 必须具有完全相同的维度,或者具有适用于广播(broadcasting,也称为隐式扩展 implicit expansion)的兼容维度。
示例 1:两个向量相乘
Section titled “示例 1:两个向量相乘”让我们将两个相同大小的向量相乘。
% 定义两个行向量A = [1 2 3];B = [4 5 6];
% 执行逐元素乘法X = A .* B命令窗口输出:
X = 4 10 18X 中的每个元素都是 A 和 B 中相同位置元素的乘积(即 X(1)=A(1)*B(1),X(2)=A(2)*B(2) 等)。
示例 2:使用标量进行广播
Section titled “示例 2:使用标量进行广播”一个常见的用例是将整个矩阵乘以一个单一数字。这是广播的一种简单形式。
% 定义一个 2x3 矩阵M = [1, 2, 3; 4, 5, 6];
% 将整个矩阵缩放 10 倍Scaled_M = M .* 10命令窗口输出:
Scaled_M = 10 20 30 40 50 60示例 3:广播行向量和列向量
Section titled “示例 3:广播行向量和列向量”广播允许 MATLAB 隐式地扩展具有单例维度的数组,以匹配另一个数组的大小。这里,我们将一个 1x3 的行向量与一个 4x1 的列向量相乘,生成一个 4x3 的矩阵。这对于创建查找表或网格非常强大。
% 定义一个 1x3 的行向量rowVec = 1:3;
% 定义一个 4x1 的列向量(注意转置运算符 ')colVec = (1:4)';
% 将它们相乘。MATLAB 会将 rowVec 向下扩展 4 次,并将 colVec 向右扩展 3 次。resultMatrix = colVec .* rowVec命令窗口输出:
resultMatrix = 1 2 3 2 4 6 3 6 9 4 8 12矩阵乘法:星号运算符(*)
Section titled “矩阵乘法:星号运算符(*)”矩阵乘法用于线性代数运算,例如求解线性方程组、执行几何变换或处理状态空间模型。这与逐元素乘法有着根本的区别。
% 星号运算符C = A * B
% 等效的函数调用C = mtimes(A, B)对于 C = A * B,内层维度必须匹配。如果 A 是一个 m x n 矩阵,则 B 必须是一个 n x p 矩阵。结果矩阵 C 将是 m x p。
示例 4:清晰比较
Section titled “示例 4:清晰比较”让我们定义两个矩阵,看看两种乘法之间的区别。
% 定义两个 2x2 矩阵A = [1, 2; 3, 4];B = [5, 6; 7, 8];
% 执行逐元素乘法C_elementwise = A .* B
% 执行矩阵乘法C_matrix = A * B命令窗口输出:
C_elementwise = 5 12 21 32
C_matrix = 19 22 43 50请注意完全不同的结果!C_matrix(1,1) 的计算方式是 (1*5 + 2*7) = 19,遵循矩阵乘法的规则。
最佳实践和常见错误
Section titled “最佳实践和常见错误”- 何时使用哪种? 使用
.*(以及./、.^)来将公式应用于数据。使用*(以及/用于矩阵除法)进行线性代数运算。 - 常见错误:
Incorrect dimensions for matrix multiplication. Check that the number of columns in the first matrix matches the number of rows in the second matrix.当您使用*但内层维度不匹配时,就会发生此错误。解决方法是检查您的逻辑,或者如果您的意图是逐元素乘法,则使用.*。 - 性能:MATLAB 的矩阵运算(
*)通过底层库(如 BLAS 和 LAPACK)进行了高度优化。对于线性代数运算,它们的速度非常快。