矢量规范的矢量数组在MATLAB中

时间:2011-08-26 19:16:53

标签: arrays matlab matrix vectorization normalization

当在MATLAB中的矩阵上调用norm时,它返回所谓的“矩阵范数”(标量值),而不是矢量范数数组。有没有办法在没有循环的情况下获得矩阵中每个向量的范数并利用MATLAB的向量化?

4 个答案:

答案 0 :(得分:26)

您可以使用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,可以轻松地使这些规范对行而不是列进行操作。

答案 1 :(得分:4)

答案 2 :(得分:3)

可以改进两种规范的现有实施。

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个虚数组件的复数)。

答案 3 :(得分:1)

轻微添加到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