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
がこの一時的なマトリックスを作成するという頭痛に対処することなく、フードの下で行うことです。この複製は、あなたがそれについて考えなくても実行されます。
ありがとうございました! – mcExchange