Skip to content

MATLAB - 数组乘法

MATLAB - 数组运算:逐元素乘法 vs. 矩阵乘法

Section titled “MATLAB - 数组运算:逐元素乘法 vs. 矩阵乘法”

在 MATLAB 中,“乘法”一词可以有两种截然不同的含义,理解其区别对于正确高效地编写代码至关重要。我们区分逐元素乘法(element-wise multiplication),它作用于数组的对应元素,以及矩阵乘法(matrix multiplication),它遵循线性代数的规则。

当您希望将两个数组的对应元素相乘时,请使用逐元素乘法。这常用于数据缩放、将公式应用于数据集或处理非线性方程。

% 点星号运算符
X = A .* B
% 等效的函数调用(在脚本中不常用)
X = times(A, B)

为了使 A .* B 正常工作,数组 A 和 B 必须具有完全相同的维度,或者具有适用于广播(broadcasting,也称为隐式扩展 implicit expansion)的兼容维度。

让我们将两个相同大小的向量相乘。

% 定义两个行向量
A = [1 2 3];
B = [4 5 6];
% 执行逐元素乘法
X = A .* B

命令窗口输出:

X =
4 10 18

X 中的每个元素都是 A 和 B 中相同位置元素的乘积(即 X(1)=A(1)*B(1),X(2)=A(2)*B(2) 等)。

一个常见的用例是将整个矩阵乘以一个单一数字。这是广播的一种简单形式。

% 定义一个 2x3 矩阵
M = [1, 2, 3; 4, 5, 6];
% 将整个矩阵缩放 10 倍
Scaled_M = M .* 10

命令窗口输出:

Scaled_M =
10 20 30
40 50 60

广播允许 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

矩阵乘法用于线性代数运算,例如求解线性方程组、执行几何变换或处理状态空间模型。这与逐元素乘法有着根本的区别。

% 星号运算符
C = A * B
% 等效的函数调用
C = mtimes(A, B)

对于 C = A * B,内层维度必须匹配。如果 A 是一个 m x n 矩阵,则 B 必须是一个 n x p 矩阵。结果矩阵 C 将是 m x p。

让我们定义两个矩阵,看看两种乘法之间的区别。

% 定义两个 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,遵循矩阵乘法的规则。

  • 何时使用哪种? 使用 .*(以及 ./、.^)来将公式应用于数据。使用 *(以及 / 用于矩阵除法)进行线性代数运算。
  • 常见错误: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)进行了高度优化。对于线性代数运算,它们的速度非常快。