HOWTO · MATLAB

MATLAB norm() 函式

在 MATLAB 中,`norm()` 可計算向量範數;若要計算矩陣的 Frobenius 範數,請使用 `norm(A,"fro")` 明確指定。

本頁內容

MATLAB norm() 用來計算向量或矩陣的大小。預設行為取決於輸入:向量使用 2 範數,矩陣則使用矩陣 2 範數,也稱為譜範數。若需要其他度量,請明確指定階數或選項。若要分別計算各列或各欄的範數,請使用 vecnorm()。

MATLAB norm() 的語法與預設行為

使用 n = norm(X) 採用預設值,使用 n = norm(X,p) 指定階數,或使用 n = norm(X,"fro") 明確要求計算矩陣的 Frobenius 範數。X 是輸入向量或矩陣。p 的意義取決於 X 是向量還是矩陣,因此相同的階數不一定代表相同的計算方式。

對向量而言,norm(v) 等同於 norm(v,2)。對矩陣而言,norm(A) 等同於 norm(A,2):它會回傳最大奇異值,而非 Frobenius 範數。若要計算矩陣的 Frobenius 範數,必須明確指定 "fro"。

選擇向量範數

對向量 v 而言,正的有限 p 所對應的 p 範數,是將各元素絕對值的 p 次方加總後,再取 p 次方根。常見選擇包括 norm(v,1)(絕對值總和)、norm(v,2)(歐幾里得長度),以及 norm(v,Inf)(最大絕對值)。省略 p 時會採用 2 範數。

若要衡量絕對值總和,可使用 1 範數;若要表示歐幾里得長度,可使用 2 範數;若尺度由最大分量決定,則可使用無窮範數。這些範數以不同方式概括同一個向量,請依計算需求選擇。例如,分量為 3 和 4 的向量,其 1 範數為 7、2 範數為 5,無窮範數為 4。

選擇矩陣範數

對矩陣 A 而言,MATLAB 可透過 norm(A,p) 計算 1、2 與無窮範數;這些範數的定義與向量範數不同。矩陣 1 範數是各欄絕對值總和中的最大值。矩陣 2 範數是最大奇異值,也是預設值。矩陣無窮範數是各列絕對值總和中的最大值。使用 norm(A,"fro") 可明確要求計算矩陣的 Frobenius 範數,也就是所有元素絕對值平方總和的平方根。

例如,對 A = [1 2; 3 4] 而言,1 範數為 6,無窮範數為 7。Frobenius 範數是 30 的平方根,而 2 範數是最大奇異值(約為 5.465)。不要從 norm(A) 推斷矩陣的 Frobenius 範數;請用 "fro" 明確指定。

執行範例並解讀結果

執行以下範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

v = [3 4];
A = [1 2; 3 4];
fprintf('vector 2-norm: %.1f\n', norm(v));
fprintf('matrix default (2-norm): %.4f\n', norm(A));
fprintf('matrix 1-norm: %.1f\n', norm(A, 1));
fprintf('matrix infinity-norm: %.1f\n', norm(A, Inf));
fprintf('matrix Frobenius norm: %.4f\n', norm(A, "fro"));
vector 2-norm: 5.0
matrix default (2-norm): 5.4650
matrix 1-norm: 6.0
matrix infinity-norm: 7.0
matrix Frobenius norm: 5.4772

向量的結果是其歐幾里得長度。對矩陣而言,預設呼叫與明確指定階數 2 都會回傳譜範數;其他幾行則分別顯示最大欄絕對值總和、最大列絕對值總和,以及明確指定的 Frobenius 範數。這些數值有助於確認計算採用哪一種定義。

使用 vecnorm() 計算各列或各欄的範數

norm() 會回傳整個輸入的一個範數。若要分別取得各欄或各列的範數,請呼叫 vecnorm(X,p,dim)。dim 引數指定要沿著哪個維度計算。對二維矩陣而言,維度 1 會沿每一欄向下計算,並為每欄回傳一個值;維度 2 會沿每一列計算,並為每列回傳一個值。若省略此引數,vecnorm() 會使用第一個非單一維度;對一般矩陣而言,這表示各欄。

例如,使用 vecnorm(A,2,1) 計算每一欄的 2 範數,使用 vecnorm(A,2,2) 計算每一列的 2 範數。這是逐維度計算的方式;在 norm() 中加入維度引數,並不能用來要求逐列或逐欄範數。若只需要整個向量或矩陣的一個度量,請選擇 norm();若結果需要包含沿某個維度切片後各部分的範數,則使用 vecnorm()。