MATLABの行列で norm
を呼び出すと、ベクトルノルムの配列ではなく、「行列ノルム」(スカラー値)と呼ばれるものが返されます。ループせずにMATLABのベクトル化を利用せずに、行列内の各ベクトルのノルムを取得する方法はありますか?
要素ごとの算術演算子 と、指定された行列の次元で動作するように定義された関数( [〜#〜] 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
に変更することで、列ではなく行を操作するように簡単に作成できます。
バージョン2017b以降では、 vecnorm を使用できます。
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の複素数ではなく)実数に対して機能するようになります。
P iの答え へのわずかな追加:
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