V = [Vx Vy Vz]
2 つのベクトルとの間の角度を計算したいB = [Bx By Bz]
。この式は正しいですか?
VdotB = (Vx*Bx + Vy*By + Vz*Bz)
Angle = acosd (VdotB / norm(V)*norm(B))
それを計算する他の方法はありますか?
私の質問は、ベクトルを正規化するためでも、簡単にするためでもありません。この2つのベクトルの間の角度を取得する方法について質問しています
多くのオプションがあります:
a1 = atan2(norm(cross(v1,v2)), dot(v1,v2))
a2 = acos(dot(v1, v2) / (norm(v1) * norm(v2)))
a3 = acos(dot(v1 / norm(v1), v2 / norm(v2)))
a4 = subspace(v1,v2)
この mathworks スレッドのすべての数式。a3が一番安定していると言われていますが、その理由はわかりません。
行列の列に複数のベクトルが格納されている場合、次のコードを使用して角度を計算できます。
% Calculate the angle between V (d,N) and v1 (d,1)
% d = dimensions. N = number of vectors
% atan2(norm(cross(V,v2)), dot(V,v2))
c = bsxfun(@cross,V,v2);
d = sum(bsxfun(@times,V,v2),1);%dot
angles = atan2(sqrt(sum(c.^2,1)),d)*180/pi;
この関数は角度をラジアンで返します。
function [ alpharad ] = anglevec( veca, vecb )
% Calculate angle between two vectors
alpharad = acos(dot(veca, vecb) / sqrt( dot(veca, veca) * dot(vecb, vecb)));
end
anglevec([1 1 0],[0 1 0])/(2 * pi/360)
>> 45.00
VdotB
ドット演算子を使用すると、任意の長さのベクトルをはるかに高速に計算できます。つまり、次のようになります。
VdotB = sum(V(:).*B(:));
さらに、コメントで述べたように、matlab には内積を直接計算するドット関数があります。
それに加えて、式はそれが何であるかであるため、あなたがしていることは正しいです.