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() 可确保sumsqrt 作用于实数(而不是虚部为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中向量数组的向量范数的主要内容,如果未能解决你的问题,请参考以下文章

向量范数和矩阵范数

向量与矩阵的范数及其在matlab中的用法(norm)

向量和矩阵的各种范数比较(1范数2范数无穷范数等等

matlab常用函数

向量范数和矩阵范数

Eigen:按行计算矩阵的范数,比在向量上迭代计算它们要慢