【发布时间】:2011-11-04 18:56:05
【问题描述】:
在 MATLAB 中对矩阵调用 norm 时,它会返回所谓的“矩阵范数”(标量值),而不是向量范数数组。有没有什么方法可以在不循环和利用 MATLAB 的向量化的情况下获得矩阵中每个向量的范数?
【问题讨论】:
标签: arrays matlab matrix vectorization normalization
在 MATLAB 中对矩阵调用 norm 时,它会返回所谓的“矩阵范数”(标量值),而不是向量范数数组。有没有什么方法可以在不循环和利用 MATLAB 的向量化的情况下获得矩阵中每个向量的范数?
【问题讨论】:
标签: arrays matlab matrix vectorization normalization
您可以使用element-wise arithmetic operators 和定义为对给定矩阵维度进行操作的函数(如SUM 和MAX)自行计算矩阵的每一列或每一行的范数。以下是计算矩阵 M 的一些列范数的方法:
twoNorm = sqrt(sum(abs(M).^2,1)); %# The two-norm of each column
pNorm = sum(abs(M).^p,1).^(1/p); %# The p-norm of each column (define p first)
infNorm = max(M,[],1); %# The infinity norm (max value) of each column
通过将维度参数从 ...,1 更改为 ...,2,可以轻松地对行而不是列进行操作。
【讨论】:
M 仅包含实数,您可以将twoNorm 中的abs(M) 替换为M,因为.^2 有效地抵消了所有负号。
sqrt(dot(M, M, dim))。
可以改进二范数的现有实现。
twoNorm = sqrt(sum(abs(M).^2,1)); # The two-norm of each column
abs(M).^2 将计算一大堆不必要的平方根,这些平方根会立即平方。
做得更好:
twoNorm = sqrt(
sum( real(M .* conj(M)), 1 )
)
这可以有效地处理实数和复数 M。
使用real() 可确保sum 和sqrt 作用于实数(而不是虚部为0 的复数)。
【讨论】:
norm_2 = @(A,dim)sqrt( sum( real(A).*conj(A) , dim) ) 允许 B=magic([2,3]) 和 norm_2( B , 1) 或 norm_2( B , 2)。
从 2017b 版本开始,您可以使用vecnorm。
【讨论】:
对P i's answer的轻微补充:
norm_2 = @(A,dim)sqrt( sum( real(A).*conj(A) , dim) )
允许
B=magic([2,3])
norm_2( B , 1)
norm_2( B , 2)
如果你想要一个 norm_2.m 文件,也可以这样:
function norm_2__ = norm_2 (A_,dim_)
norm_2__ = sqrt( sum( real(A_).*conj(A_) , dim_) ) ;
end
【讨论】: