Skip to content

MATLAB - 多维数组

虽然向量(1 维)和矩阵(2 维)是 MATLAB 中最常见的数组,但该语言原生支持任意维数的数组。多维(或 N 维)数组是存储和组织复杂数据的强大方式。您可以将 3 维数组视为一本电子表格,其中每一页都是一个 2 维矩阵。

多维数组对于许多实际应用至关重要:

  • 图像处理:标准彩色(RGB)图像是一个 M-by-N-by-3 数组,其中 M 是高度,N 是宽度,3 个“页”代表红色(Red)、绿色(Green)和蓝色(Blue)颜色通道。
  • 时间序列分析:存储来自多个传感器随时间变化的数据可以表示为 样本数-by-传感器数-by-试验数 数组。
  • 数值模拟:存储参数扫描的结果,例如板材随时间变化的温度,可以是一个 x位置-by-y位置-by-时间步长 数组。

您可以使用初始化函数或通过连接现有数组来创建 N 维数组。

% 1. 使用初始化函数(推荐)
% 创建一个 2x4x3 的随机数数组
A = rand(2, 4, 3);
% 创建一个 5x2x4 的全零数组
Z = zeros(5, 2, 4);
% 2. 连接现有矩阵
% cat() 函数是构建 N 维数组的稳健方法
mat1 = [1 2; 3 4]; % 2x2 矩阵
mat2 = [5 6; 7 8]; % 另一个 2x2 矩阵
% 沿第 3 维度(页)连接以创建 2x2x2 数组
C = cat(3, mat1, mat2);

size() 函数适用于 N 维数组,返回每个维度的长度。

size(C)
ans =
2 2 2

要访问元素,您需要为每个维度提供一个索引,用逗号分隔。冒号 : 运算符选择维度中的所有元素,end 关键字表示最后一个元素。

% 让我们使用上一个示例中的 2x2x2 数组 C
% C(:,:,1) 是 [1 2; 3 4], C(:,:,2) 是 [5 6; 7 8]
% 获取第 1 行、第 2 列、第 2 页的元素
elem = C(1, 2, 2);
% 结果: 6
% 获取第一页的整个第一行
row_vec = C(1, :, 1);
% 结果: [1 2]
% 获取所有页的整个第二列
% 这会得到一个 2x1x2 数组
col_matrix = C(:, 2, :);
% 使用 squeeze() 移除单例维度(如中间的 '1')
squeezed_cols = squeeze(col_matrix);
% 结果: 一个 2x2 矩阵 [2 6; 4 8]

大多数 MATLAB 数学函数可以沿着 N 维数组的指定维度进行操作。这对于数据分析来说非常强大。

% 创建一个 3x4x2 示例数组
data = randi(10, [3, 4, 2]);
% 找到每列的平均值(即沿维度 1 操作)
mean_cols = mean(data, 1);
% 结果将是一个 1x4x2 数组
% 找到每页的总和(即沿维度 3 操作)
sum_pages = sum(data, 3);
% 结果将是一个 3x4 矩阵

有时您需要重新排列数组的维度,以便进行计算或与其它工具交互。MATLAB 提供了几个关键函数来完成此操作。

  • reshape(A, sz):改变数组的大小,而不改变其在内存中元素的顺序。元素总数必须保持不变。
  • permute(A, order):重新排列数组的维度。这对于将 RGB 图像从 MxNx3 转置为 3xMxN 等任务非常有用。
  • squeeze(A):移除长度为 1 的维度。在切片后简化数组时很有用。
  • pagetranspose(A) 或 A.':转置多维数组的每个 2 维页面(R2020b 新功能)。
% 创建一个伪图像:100 像素高,80 像素宽,3 个颜色通道
rgbImage = rand(100, 80, 3);
% 某些库可能期望通道维度在前(通道 x 高度 x 宽度)
% 原始顺序是 [1, 2, 3] 代表 (高度, 宽度, 通道)
% 我们希望新顺序为 [3, 1, 2]
permutedImage = permute(rgbImage, [3, 1, 2]);
size(rgbImage)
ans =
100 80 3
size(permutedImage)
ans =
3 100 80