MATLAB - 兼容数组
MATLAB - 隐式扩展
Section titled “MATLAB - 隐式扩展”隐式扩展(Implicit expansion),有时也称为广播(broadcasting),是 MATLAB 中一个强大的特性,它简化了向量和矩阵运算。当你对大小不同但兼容的数组执行逐元素操作时,MATLAB 会自动扩展较小维度以匹配较大维度,从而避免了手动复制数组的需要。
此特性在 MATLAB R2016b 中正式扩展并命名。如果两个数组在每个维度上的大小要么相等,要么其中一个为 1,则它们在操作上是兼容的。
隐式扩展的核心原则
Section titled “隐式扩展的核心原则”- 标量扩展:最常见的情况。标量可以与任何大小的数组组合。标量会有效地扩展以匹配另一个数组的大小。
- 向量与矩阵扩展:行向量或列向量可以与二维矩阵组合,前提是其长度与对应的矩阵维度匹配(行向量长度与列数匹配,列向量长度与行数匹配)。
示例 1:标量扩展
Section titled “示例 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示例 2:向量与矩阵扩展
Section titled “示例 2:向量与矩阵扩展”从矩阵中减去列向量。这是数据归一化的常见操作,例如减去每行的均值。
% 一个 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示例 3:行向量与列向量扩展
Section titled “示例 3:行向量与列向量扩展”当你组合一个列向量(大小 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常见错误:维度不匹配
Section titled “常见错误:维度不匹配”如果数组维度不兼容,则会发生错误。要使操作成功,每个维度的大小必须相同,或者其中一个必须为 1。
% 不兼容的数组A = [1, 2, 3]; % 大小 1x3B = [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.