# 多维数组 本文来源:[多维数组 - MATLAB & Simulink - MathWorks 中国](https://ww2.mathworks.cn/help/matlab/math/multidimensional-arrays.html) 尝试此示例**Copy Code** Copy Command MATLAB® 中的多维数组是指具有两个以上维度的数组。在矩阵中,两个维度由行和列表示。 ![](https://ww2.mathworks.cn/help/matlab/math/nddemo_01_zh_CN.gif) 每个元素由两个下标(即行索引和列索引)来定义。多维数组是二维矩阵的扩展,并使用额外的下标进行索引。例如,三维数组使用三个下标。前两个维度就像一个矩阵,而第三个维度表示元素的*页数*或*张数*。 ![](https://ww2.mathworks.cn/help/matlab/math/nddemo_02_zh_CN.gif) ## 创建多维数组 要创建多维数组,可以先创建二维矩阵,然后再进行扩展。例如,首先定义一个 3×3 矩阵,作为三维数组中的第一页。 **Get** ``` A = [1 2 3; 4 5 6; 7 8 9] ``` ``` A = 3×3 1 2 3 4 5 6 7 8 9 ``` 现在添加第二页。要完成此操作,可将另一个 3×3 矩阵赋给第三个维度中的索引值 2。语法 `A(:,:,2)` 在第一个和第二个维度中使用冒号,以在其中包含赋值表达式右侧的所有行和所有列。 **Get** ``` A(:,:,2) = [10 11 12; 13 14 15; 16 17 18] ``` ``` A = A(:,:,1) = 1 2 3 4 5 6 7 8 9 A(:,:,2) = 10 11 12 13 14 15 16 17 18 ``` [`cat`](https://ww2.mathworks.cn/help/matlab/ref/double.cat.html) 函数可用于构造多维数组。例如,在 `A` 后以串联方式添加第三页,由此创建一个新的三维数组 `B`。第一个参数指示要沿哪一个维度进行串联。 **Get** ``` B = cat(3,A,[3 2 1; 0 9 8; 5 3 7]) ``` ``` B = B(:,:,1) = 1 2 3 4 5 6 7 8 9 B(:,:,2) = 10 11 12 13 14 15 16 17 18 B(:,:,3) = 3 2 1 0 9 8 5 3 7 ``` 快速扩展多维数组的另一种方法是将一个元素赋给一整页。例如,为数组 `B` 添加第四页,其中包含的值全部为零。 **Get** ``` B(:,:,4) = 0 ``` ``` B = B(:,:,1) = 1 2 3 4 5 6 7 8 9 B(:,:,2) = 10 11 12 13 14 15 16 17 18 B(:,:,3) = 3 2 1 0 9 8 5 3 7 B(:,:,4) = 0 0 0 0 0 0 0 0 0 ``` ## 访问元素 要访问多维数组中的元素,请使用整数下标,就像在向量和矩阵中一样。例如,找到 `A` 中下标为 1,2,2 的元素,它位于 `A` 的第二页上的第一行第二列。 **Get** ``` A ``` ``` A = A(:,:,1) = 1 2 3 4 5 6 7 8 9 A(:,:,2) = 10 11 12 13 14 15 16 17 18 ``` **Get** ``` elA = A(1,2,2) ``` ``` elA = 11 ``` 在第二个维度中使用索引向量 `[1 3]`,只访问 `A` 的每一页上的第一列和最后一列。 **Get** ``` C = A(:,[1 3],:) ``` ``` C = C(:,:,1) = 1 3 4 6 7 9 C(:,:,2) = 10 12 13 15 16 18 ``` 要查找每一页的第二行和第三行,请使用冒号运算符创建索引向量。 **Get** ``` D = A(2:3,:,:) ``` ``` D = D(:,:,1) = 4 5 6 7 8 9 D(:,:,2) = 13 14 15 16 17 18 ``` ## 操作数组 多维数组的元素可以通过多种方式移动,类似于向量和矩阵。[`reshape`](https://ww2.mathworks.cn/help/matlab/ref/reshape.html)、[`permute`](https://ww2.mathworks.cn/help/matlab/ref/permute.html) 和 [`squeeze`](https://ww2.mathworks.cn/help/matlab/ref/squeeze.html) 函数可用于重新排列元素。假设有一个两页的三维数组。 ![](https://ww2.mathworks.cn/help/matlab/math/nddemo_03_zh_CN.gif) 重构多维数组有助于执行某些操作或可视化数据。使用 `reshape` 函数,将一个三维数组的元素重新排列成 6×5 矩阵。 **Get** ``` A = [1 2 3 4 5; 9 0 6 3 7; 8 1 5 0 2]; A(:,:,2) = [9 7 8 5 2; 3 5 8 5 1; 6 9 4 3 3]; B = reshape(A,[6 5]) ``` ``` B = 6×5 1 3 5 7 5 9 6 7 5 5 8 5 2 9 3 2 4 9 8 2 0 3 3 8 1 1 0 6 4 3 ``` `reshape` 逐列操作,沿 `A` 中各列连续逐一提取元素来创建新矩阵,从第一页开始,之后是第二页。 置换操作用于重新排列数组的维度顺序。假设有一个三维数组 `M`。 **Get** ``` M(:,:,1) = [1 2 3; 4 5 6; 7 8 9]; M(:,:,2) = [0 5 4; 2 7 6; 9 3 1] ``` ``` M = M(:,:,1) = 1 2 3 4 5 6 7 8 9 M(:,:,2) = 0 5 4 2 7 6 9 3 1 ``` 使用 `permute` 函数,通过在第二个参数中指定维度顺序,将每一页上的行下标和列下标交换。`M` 的原始行现在是列,原始列现在是行。 **Get** ``` P1 = permute(M,[2 1 3]) ``` ``` P1 = P1(:,:,1) = 1 4 7 2 5 8 3 6 9 P1(:,:,2) = 0 2 9 5 7 3 4 6 1 ``` 同样,将 `M` 的行下标和页下标交换。 **Get** ``` P2 = permute(M,[3 2 1]) ``` ``` P2 = P2(:,:,1) = 1 2 3 0 5 4 P2(:,:,2) = 4 5 6 2 7 6 P2(:,:,3) = 7 8 9 9 3 1 ``` 操作多维数组时,您可能会遇到某些数组有一个长度为 1 的多余维度。`squeeze` 函数可以执行另一种操作,消除长度为 1 的维度。例如,使用 [`repmat`](https://ww2.mathworks.cn/help/matlab/ref/repmat.html) 函数创建一个 2×3×1×4 数组,其元素全部为 5,第三个维度的长度为 1。 **Get** ``` A = repmat(5,[2 3 1 4]) ``` ``` A = A(:,:,1,1) = 5 5 5 5 5 5 A(:,:,1,2) = 5 5 5 5 5 5 A(:,:,1,3) = 5 5 5 5 5 5 A(:,:,1,4) = 5 5 5 5 5 5 ``` **Get** ``` szA = size(A) ``` ``` szA = 1×4 2 3 1 4 ``` **Get** ``` numdimsA = ndims(A) ``` ``` numdimsA = 4 ``` 使用 `squeeze` 函数删除第三个维度,从而得到一个三维数组。 **Get** ``` B = squeeze(A) ``` ``` B = B(:,:,1) = 5 5 5 5 5 5 B(:,:,2) = 5 5 5 5 5 5 B(:,:,3) = 5 5 5 5 5 5 B(:,:,4) = 5 5 5 5 5 5 ``` **Get** ``` szB = size(B) ``` ``` szB = 1×3 2 3 4 ``` **Get** ``` numdimsB = ndims(B) ``` ``` numdimsB = 3 ```