512x512 の次元ベクトルを格納する 512x512x3 の行列があります。結果が長さ 1 の 512x512 ベクトルになるように、これらすべてのベクトルを正規化する最良の方法は何ですか?
現時点では for ループを使用していますが、それが MATLAB での最善の方法だとは思いません。
512x512 の次元ベクトルを格納する 512x512x3 の行列があります。結果が長さ 1 の 512x512 ベクトルになるように、これらすべてのベクトルを正規化する最良の方法は何ですか?
現時点では for ループを使用していますが、それが MATLAB での最善の方法だとは思いません。
ベクトルがユークリッドの場合、それぞれの長さはその座標の平方和の平方根です。各ベクトルが単位長になるように個別に正規化するには、その座標をそのノルムで割る必要があります。その目的のために、次を使用できますbsxfun
。
norm_A = sqrt(sum(A .^ 2, 3)_; %// Calculate Euclidean length
norm_A(norm_A < eps) == 1; %// Avoid division by zero
B = bsxfun(@rdivide, A, norm_A); %// Normalize
はA
元の 3 次元ベクトル行列です。
編集:Shai のコメントに続いて、null ベクトルのゼロ除算を回避するための修正を追加しました。