2016-04-05 24 views
2

Matlabのループを遅くすることなく、3次元行列の各行を正規化する簡単な方法はありますか?L2 Matlabの3次元行列を正規化する

私の入力データは次のようになります言う:

d(:,:,1) = 
1  2  3 
4  5  6 

d(:,:,2) = 
7  8  9 
10 11 12 

私は

norms = sqrt(sum(d.^2,2)) 
norms(:,:,1) = 
3.7417 
8.7750 

norms(:,:,2) = 
13.9284 
19.1050 

を使用することにより、各行のノルムを得ることができることをしかし、これらの規範となりました第二の次元を分割する方法を知っています値? 私は2 dimsで私は./を使用できることを知っていますが、これは3次元データのためには機能しないようです。

答えて

3

bsxfunはあなたの友達です:

out = bsxfun(@rdivide, d, norms); 

これはありませんが、それは一時的dにと同数の列にnormsの各行を複製し、3Dマトリックスを作成し、それが要素の各要素を分割していることですdおよびnormsである。

我々が得る:

>> d = cat(3, [1 2 3; 4 5 6], [7 8 9; 10 11 12]); 
>> norms = sqrt(sum(d.^2,2)); 
>> out = bsxfun(@rdivide, d, norms) 

out(:,:,1) = 

    0.2673 0.5345 0.8018 
    0.4558 0.5698 0.6838 


out(:,:,2) = 

    0.5026 0.5744 0.6462 
    0.5234 0.5758 0.6281 

我々はまた、各行は独立して、各行に沿った二乗の和を決定し、1に、各結果は合計ことを確実にすることによってL2-正規化されていることを確認することができる:

>> sum(out.^2, 2) 

ans(:,:,1) = 

    1.0000 
    1.0000 


ans(:,:,2) = 

    1.0000 
    1.0000 

bsxfunのアプローチが意味をなさない場合は、を使用してdと同じ次元を尊重した行列を作成することができます。次に、要素ごとにdiあなたが望むビジョン:

>> out = d ./ repmat(norms, [1 size(d,2) 1]) 

out(:,:,1) = 

    0.2673 0.5345 0.8018 
    0.4558 0.5698 0.6838 


out(:,:,2) = 

    0.5026 0.5744 0.6462 
    0.5234 0.5758 0.6281 

あなたは行列が各次元でコピーしたい回数を指定repmat付き。行とスライスの数は同じですが、列の上に行列を複製するだけです...したがって、各次元で行列をコピーする回数を指定するベクトル[1 size(d,2) 1]があります。

実際には、これはbsxfunがこの一時的なマトリックスを作成するという頭痛に対処することなく、フードの下で行うことです。この複製は、あなたがそれについて考えなくても実行されます。

+1

ありがとうございました! – mcExchange

関連する問題