HOWTO · MATLAB
如何在 MATLAB 中将向量附加到 3D 矩阵
本文将指导您了解在 MATLAB 中将向量附加到 3D 矩阵的方法。
本页内容
MATLAB 将 3D 数组存储为行、列和页面。若要在末尾添加一个兼容的页面,可使用 cat(3, A, page) 沿维度 3 连接,或使用 A(:,:,end+1) = page 进行赋值。新页面必须与每个现有页面具有相同的行维度和列维度。当每个页面有一行时,行向量就是一个完整的页面;当每个页面有一列时,列向量就是一个完整的页面。
了解 3D 矩阵页面和大小兼容性
3D 数组的第一个维度是行维度,第二个是列维度,第三个是页面维度。例如,一个大小为 2-by-3-by-4 的数组包含四个页面,每个页面有两行三列。MATLAB 分开显示这些页面,元素通过如 A(1,2,3) 的行、列和页面索引来寻址。若要选取整个页面,请使用 A(:,:,k);例如,A(:,:,3) 选取第三个页面。
沿第三个维度附加会增加页面数量,同时保持前两个维度固定。如果 A 的大小为 M-by-N-by-P,您添加的页面必须是 M-by-N,因此结果大小为 M-by-N-by-(P+1)。向量只有在其方向和长度与页面形状匹配时,才能直接作为该页面:1-by-N 行向量适合单行页面,而 M-by-1 列向量适合单列页面。对于一般的 M-by-N 页面,请先将值排列成 M-by-N 矩阵。
使用 cat 将向量作为新页面附加
使用 cat(3, A, page) 沿页面维度将 page 连接到 A 的末尾。第一个参数选择维度;使用 cat(1, ...) 会添加行,使用 cat(2, ...) 会添加列。其余维度必须匹配,这就是为什么下面的向量有两个条目,而现有页面各有一行两列。
这个与 Octave 兼容的 MATLAB 示例创建了两个页面,然后将行向量添加为第三个页面:
A = reshape(1:4, 1, 2, 2);
page = [5 6];
A = cat(3, A, page);
disp(size(A));
disp(A(:,:,3));
1 2 3
5 6
新数组有三个页面。它的第三个页面按相同顺序包含 page 的值。在 MATLAB 中,当您想从原始数组和添加的页面创建一个新的数组值时,cat() 很有用;当您想更新该变量时,请将结果赋值回 A。
使用索引将向量作为新页面附加
索引赋值是 cat 方法的替代方案。从前一个示例中原始的两页面 A 开始,在其 cat 行运行之前,使用 A(:,:,end+1) = page; 代替该行。不要连续运行这两个附加语句:赋值也会扩展第三个维度,因此在 cat 之后运行它会添加第四个页面。这里 end 指的是沿第三个维度的最后一个索引,end+1 选取下一个页面。
当直接更新 A 最清楚时,请使用这种形式。赋值的 page 必须与现有的行维度和列维度匹配;当向量的方向或长度不符合页面形状时,请先排列向量。
准备与页面大小匹配的向量
如果向量比页面短,请在附加之前决定其余条目应代表什么。当零有意义时,请创建一个具有所需维度的页面,并将向量值放在预期的位置。例如,对于一个 2-by-3 页面,其第一列包含一个两元素列向量,像 [values(:), zeros(2,2)] 这样的构造会使其他两列为零。然后使用上述任一方法附加该页面。
填充是一种数据选择,而不是永远安全的形状转换:这些零会成为存储页面的一部分,并可能影响后续计算。如果缺失值有其他含义,请改用适当的填充值,或重新整形/重新排序源数据。在连接或赋值之前,将 size(A,1) 和 size(A,2) 与页面的第一和第二维度进行比较。这可以更容易地定位维度不匹配,并使预期的行列布局保持明确。
使用索引替换行、列或页面
替换现有内容与附加页面不同。例如,A(1,:,1) = replacementRow; 替换第一个页面的第一行,而 A(:,:,1) = replacementPage; 替换整个现有页面。替换内容必须与索引区域具有相同数量的元素和兼容的维度。
当目标是更新数组中已有的数据时,请使用现有索引。当目标是在当前最后一个页面之后添加页面时,请在第三个索引中使用 end+1。这种区别有助于防止当您打算保留现有数据并附加另一个页面时,赋值却覆盖了某个页面。