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。這種區別有助於防止當您打算保留現有資料並附加另一個頁面時,指派卻覆寫了某個頁面。