MATLAB - 多维数组
MATLAB - 多维数组
Section titled “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-时间步长数组。
创建多维数组
Section titled “创建多维数组”您可以使用初始化函数或通过连接现有数组来创建 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]多维数组的计算
Section titled “多维数组的计算”大多数 MATLAB 数学函数可以沿着 N 维数组的指定维度进行操作。这对于数据分析来说非常强大。
% 创建一个 3x4x2 示例数组data = randi(10, [3, 4, 2]);
% 找到每列的平均值(即沿维度 1 操作)mean_cols = mean(data, 1);% 结果将是一个 1x4x2 数组
% 找到每页的总和(即沿维度 3 操作)sum_pages = sum(data, 3);% 结果将是一个 3x4 矩阵操作数组维度
Section titled “操作数组维度”有时您需要重新排列数组的维度,以便进行计算或与其它工具交互。MATLAB 提供了几个关键函数来完成此操作。
reshape(A, sz):改变数组的大小,而不改变其在内存中元素的顺序。元素总数必须保持不变。permute(A, order):重新排列数组的维度。这对于将 RGB 图像从MxNx3转置为3xMxN等任务非常有用。squeeze(A):移除长度为 1 的维度。在切片后简化数组时很有用。pagetranspose(A)或A.':转置多维数组的每个 2 维页面(R2020b 新功能)。
示例:重新排列图像通道
Section titled “示例:重新排列图像通道”% 创建一个伪图像: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