【问题标题】:Vector norm of an array of vectors in MATLABMATLAB中向量数组的向量范数
【发布时间】:2011-11-04 18:56:05
【问题描述】:

在 MATLAB 中对矩阵调用 norm 时,它会返回所谓的“矩阵范数”(标量值),而不是向量范数数组。有没有什么方法可以在不循环和利用 MATLAB 的向量化的情况下获得矩阵中每个向量的范数?

【问题讨论】:

    标签: arrays matlab matrix vectorization normalization


    【解决方案1】:

    您可以使用element-wise arithmetic operators 和定义为对给定矩阵维度进行操作的函数(如SUMMAX)自行计算矩阵的每一列或每一行的范数。以下是计算矩阵 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-24
        • 1970-01-01
        • 1970-01-01
        • 2014-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多