Skip to content

MATLAB - 兼容数组

隐式扩展(Implicit expansion),有时也称为广播(broadcasting),是 MATLAB 中一个强大的特性,它简化了向量和矩阵运算。当你对大小不同但兼容的数组执行逐元素操作时,MATLAB 会自动扩展较小维度以匹配较大维度,从而避免了手动复制数组的需要。

此特性在 MATLAB R2016b 中正式扩展并命名。如果两个数组在每个维度上的大小要么相等,要么其中一个为 1,则它们在操作上是兼容的。

  • 标量扩展:最常见的情况。标量可以与任何大小的数组组合。标量会有效地扩展以匹配另一个数组的大小。
  • 向量与矩阵扩展:行向量或列向量可以与二维矩阵组合,前提是其长度与对应的矩阵维度匹配(行向量长度与列数匹配,列向量长度与行数匹配)。

将标量添加到矩阵中。MATLAB 会将标量扩展为相同大小的矩阵,然后执行加法运算。

matrix = [1, 2; 3, 4];
scalar = 10;
% 将 'scalar' 隐式扩展为 2x2 矩阵
result = matrix + scalar;
disp('Original Matrix:');
disp(matrix);
disp('Result after adding a scalar:');
disp(result);

输出演示了逐元素加法:

Original Matrix:
1 2
3 4
Result after adding a scalar:
11 12
13 14

从矩阵中减去列向量。这是数据归一化的常见操作,例如减去每行的均值。

% 一个 3x4 的示例数据矩阵
data = [10, 20, 30, 40; ...
15, 25, 35, 45; ...
5, 10, 15, 20];
% 一个 3x1 的行均值列向量
rowMeans = mean(data, 2); % '2' 表示跨列取均值(即,针对每一行)
% 从每一行中的对应元素减去均值。
% 3x1 的 'rowMeans' 向量被隐式扩展为 3x4 矩阵。
centeredData = data - rowMeans;
disp('Original Data:');
disp(data);
disp('Row Means (3x1 vector):');
disp(rowMeans);
disp('Centered Data (after implicit expansion):');
disp(centeredData);

输出显示了列向量如何从矩阵的每一列中减去:

Original Data:
10 20 30 40
15 25 35 45
5 10 15 20
Row Means (3x1 vector):
25.0000
30.0000
12.5000
Centered Data (after implicit expansion):
-15.0000 -5.0000 5.0000 15.0000
-15.0000 -5.0000 5.0000 15.0000
-7.5000 -2.5000 2.5000 7.5000

当你组合一个列向量(大小 M×1)和一个行向量(大小 1×N)时,结果是一个 M×N 矩阵。这是一种生成值网格或表格的强大方法。

colVector = [10; 20; 30]; % 3x1 向量
rowVector = [1, 2, 3, 4]; % 1x4 向量
% 列向量横向扩展为 4 列
% 行向量纵向扩展为 3 行
result = colVector + rowVector;
disp('Result of adding a 3x1 and 1x4 vector:');
disp(result);

生成的 3x4 矩阵是:

Result of adding a 3x1 and 1x4 vector:
11 12 13 14
21 22 23 24
31 32 33 34

如果数组维度不兼容,则会发生错误。要使操作成功,每个维度的大小必须相同,或者其中一个必须为 1。

% 不兼容的数组
A = [1, 2, 3]; % 大小 1x3
B = [4; 5]; % 大小 2x1
try
C = A + B; % 这将失败
catch ME
disp('Error caught as expected:');
disp(ME.message);
end

此代码将产生错误,因为维度(1x3 和 2x1)不兼容:

Error caught as expected:
Error using +
Matrix dimensions must agree.