MATLAB中向量数组的向量范数
Posted
技术标签:
【中文标题】MATLAB中向量数组的向量范数【英文标题】:Vector norm of an array of vectors in MATLAB 【发布时间】:2011-11-04 18:56:05 【问题描述】:在 MATLAB 中对矩阵调用 norm
时,它会返回所谓的“矩阵范数”(标量值),而不是向量范数数组。有没有什么方法可以在不循环和利用 MATLAB 的向量化的情况下获得矩阵中每个向量的范数?
【问题讨论】:
【参考方案1】:您可以使用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
,可以轻松地对行而不是列进行操作。
【讨论】:
也许您应该明确指定 SUM 和 MAX 操作的维度,这样更容易切换到按行规范... @Amro:好建议。完成! 如果M
仅包含实数,您可以将twoNorm
中的abs(M)
替换为M
,因为.^2
有效地抵消了所有负号。
如果 M 包含任何非实数,您可能需要 M.*conj(M) 代替
对于二范数也可以使用sqrt(dot(M, M, dim))
。【参考方案2】:
可以改进二范数的现有实现。
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)
。【参考方案3】:
从 2017b 版本开始,您可以使用vecnorm。
【讨论】:
【参考方案4】:对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
【讨论】:
以上是关于MATLAB中向量数组的向量范数的主要内容,如果未能解决你的问题,请参考以下文章