2011-08-26 16 views
18

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

+0

合計は? –

答えて

24

element-wise arithmetic operatorsと与えられた行列次元(例えば、SUMMAXのような)に作用するように定義された関数を使って、行列の各列または行のノルムを自分で計算することができます。これらの規範は簡単に...,1から...,2に次元の引数を変更することにより、行の代わりに列に動作させることができる

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 

:ここでは、行列Mのためのいくつかの列方向の規範を計算することができる方法です。

+3

多分SUMとMAXが動作する次元を明示的に指定して、行方法の標準に切り替えるほうが簡単かもしれません。 – Amro

+0

@Amro:良い提案です。完了! – gnovice

+2

'M'が実数のみで構成される場合、' .2 2'が効果的に負の符号を取り除くので、 'abs(M)'を 'twoNorm'の' M 'に置き換えることができます。 – kroimon

1

2ノルムの既存の実装を改善することができます。

twoNorm = sqrt(sum(abs(M).^2,1)); # The two-norm of each column 

abs(M).^2

はただ乗straightawayを取得し、不要な平方根の全体の束を計算しようとしています。

はるかに良い実行します。

twoNorm = sqrt( 
       sum(real(M .* conj(M)), 1) 
      ) 

これは、効率的に(0虚数成分を持つのではなく複素数)実数を超えることsumsqrt行為を確実にreal()を使用して実数と複素数M.

を処理します。

0

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