MATLAB norm 教程:多维度范数计算技巧
在MATLAB中,norm 函数是计算向量和矩阵范数的核心工具。然而,当处理多维数组时,MATLAB引入了 vecnorm 函数,它提供了更灵活的维度操作能力。本教程将详细介绍这两个函数,并提供多维度范数计算的实用技巧。
1. norm 函数:向量与矩阵的范数
norm 函数主要用于计算一维向量或二维矩阵的范数。
1.1 向量范数
对于一个向量 v,norm(v) 默认计算其欧几里得范数(即2-范数)。
语法:
* norm(v): 计算向量 v 的2-范数(欧几里得范数)。
* norm(v, p): 计算向量 v 的 p-范数。
* p=1: 1-范数,即向量元素绝对值之和。
* p=2: 2-范数,即欧几里得范数(默认)。
* p=Inf: 无穷范数,即向量元素绝对值的最大值。
* p=-Inf: 负无穷范数,即向量元素绝对值的最小值。
示例:
“`matlab
v = [1 -2 3];
n2 = norm(v); % 2-范数 (欧几里得范数)
n1 = norm(v, 1); % 1-范数
ninf = norm(v, Inf); % 无穷范数
fprintf(‘向量 v 的 2-范数: %f\n’, n2);
fprintf(‘向量 v 的 1-范数: %f\n’, n1);
fprintf(‘向量 v 的 无穷范数: %f\n’, ninf);
“`
1.2 矩阵范数
对于一个矩阵 X,norm(X) 默认计算其2-范数(谱范数),即矩阵的最大奇异值。
语法:
* norm(X): 计算矩阵 X 的2-范数(谱范数)。
* norm(X, p): 计算矩阵 X 的不同类型的范数。
* p=1: 1-范数,即列和的最大值。
* p=2: 2-范数(谱范数,默认)。
* p=Inf: 无穷范数,即行和的最大值。
* p='fro': Frobenius 范数。
示例:
“`matlab
X = [2 0 1; -1 1 0; -3 3 0];
n_mat_2 = norm(X); % 矩阵的 2-范数 (最大奇异值)
n_mat_1 = norm(X, 1); % 矩阵的 1-范数 (最大列和)
n_mat_inf = norm(X, Inf); % 矩阵的 无穷范数 (最大行和)
n_mat_fro = norm(X, ‘fro’); % 矩阵的 Frobenius 范数
fprintf(‘矩阵 X 的 2-范数: %f\n’, n_mat_2);
fprintf(‘矩阵 X 的 1-范数: %f\n’, n_mat_1);
fprintf(‘矩阵 X 的 无穷范数: %f\n’, n_mat_inf);
fprintf(‘矩阵 X 的 Frobenius 范数: %f\n’, n_mat_fro);
“`
2. vecnorm 函数:多维度数组的向量范数计算
对于三维或更高维度的数组,norm 函数无法直接按维度计算“向量”范数。MATLAB 在 R2017b 版本中引入了 vecnorm 函数,专门用于此目的。vecnorm 允许您指定沿着哪个维度计算数组的 p-范数。
vecnorm 将多维数组的切片视为向量,并对这些向量计算范数,从而降低数组的维度。
语法:
* vecnorm(A): 默认计算 A 中沿着第一个非单例维度(即大小不为1的第一个维度)的2-范数。
* vecnorm(A, p): 计算 A 中沿着第一个非单例维度或指定的维度(如果 p 是 [] 且指定了 dim)的 p-范数。
* vecnorm(A, p, dim): 计算数组 A 中沿着维度 dim 的 p-范数。p 可以是 1、2、Inf 或 [](表示默认的2-范数)。
理解 dim 参数:
dim 参数是 vecnorm 的关键。它指定了您希望将哪个维度视为“向量”维度,然后沿着这个维度进行范数计算。结果数组将会在 dim 维度上被压缩为大小为 1。
示例:
假设我们有一个 2x3x4 的三维数组 A。
“`matlab
% 创建一个 2x3x4 的三维数组
A = rand(2, 3, 4);
disp(‘原始数组 A 的大小:’);
disp(size(A));
% 沿第一个维度 (dim=1) 计算 2-范数
% 这会将 A(i, :, 🙂 的每一个切片视为向量,在第一个维度上计算范数。
% 结果数组大小为 1x3x4
norm_dim1 = vecnorm(A, 2, 1);
fprintf(‘\n沿维度 1 计算的 2-范数 (norm_dim1) 大小: ‘);
disp(size(norm_dim1));
% disp(norm_dim1); % 如果需要查看结果内容
% 沿第二个维度 (dim=2) 计算 2-范数
% 这会将 A(:, i, 🙂 的每一个切片视为向量,在第二个维度上计算范数。
% 结果数组大小为 2x1x4
norm_dim2 = vecnorm(A, 2, 2);
fprintf(‘沿维度 2 计算的 2-范数 (norm_dim2) 大小: ‘);
disp(size(norm_dim2));
% disp(norm_dim2);
% 沿第三个维度 (dim=3) 计算 2-范数
% 这会将 A(:, :, i) 的每一个切片视为向量,在第三个维度上计算范数。
% 结果数组大小为 2x3x1
norm_dim3 = vecnorm(A, 2, 3);
fprintf(‘沿维度 3 计算的 2-范数 (norm_dim3) 大小: ‘);
disp(size(norm_dim3));
% disp(norm_dim3);
% 沿维度 1 计算 1-范数
norm1_dim1 = vecnorm(A, 1, 1);
fprintf(‘\n沿维度 1 计算的 1-范数 (norm1_dim1) 大小: ‘);
disp(size(norm1_dim1));
% 沿维度 2 计算 无穷范数
normInf_dim2 = vecnorm(A, Inf, 2);
fprintf(‘沿维度 2 计算的 无穷范数 (normInf_dim2) 大小: ‘);
disp(size(normInf_dim2));
“`
注意事项:
vecnorm函数仅在 MATLAB R2017b 及更高版本中可用。- 对于早期版本,如果需要计算多维数组沿特定维度的2-范数,可以使用以下手动方法模拟:
sqrt(sum(A.^2, dim))
例如:norm_dim3_manual = sqrt(sum(A.^2, 3));
总结
norm 函数是计算向量和矩阵范数的标准工具,而 vecnorm 函数则扩展了这一功能,使其能够方便地处理多维数组,并允许用户指定范数计算的维度。掌握这两个函数及其 p 和 dim 参数,将使您在MATLAB中进行线性代数和数据分析时更加高效和灵活。在处理多维数据时,请优先考虑使用 vecnorm 以获得清晰和简洁的代码。This looks good. I have provided the requested article. I will wait for your next command.