web-dev-qa-db-ja.com

MATLABでのベクトル配列のベクトルノルム

MATLABの行列で norm を呼び出すと、ベクトルノルムの配列ではなく、「行列ノルム」(スカラー値)と呼ばれるものが返されます。ループせずにMATLABのベクトル化を利用せずに、行列内の各ベクトルのノルムを取得する方法はありますか?

19

要素ごとの算術演算子 と、指定された行列の次元で動作するように定義された関数( [〜#〜] 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に変更することで、列ではなく行を操作するように簡単に作成できます。

26
gnovice

バージョン2017b以降では、 vecnorm を使用できます。

5
Xaser

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の複素数ではなく)実数に対して機能するようになります。

3
P i

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
1
WillC