当在MATLAB中的矩阵上调用norm
时,它返回所谓的“矩阵范数”(标量值),而不是矢量范数数组。有没有办法在没有循环的情况下获得矩阵中每个向量的范数并利用MATLAB的向量化?
答案 0 :(得分:26)
您可以使用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
,可以轻松地使这些规范对行而不是列进行操作。
答案 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()
可确保sum
和sqrt
对实数进行操作(而不是具有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