我想計算向量之間的角度。我想2個向量的總和應該在2個向量的中間,但用我的方法計算角度,結果卻不同。我想一定是四舍五入的問題,但結果差別太大了。我嘗試了兩種不同的方法。你能解釋一下嗎,為什么?還是我的數學理解有問題?
from numpy import(array, dot, arccos, clip, sum)
from numpy.linalg import norm
import spectral
import numpy as np
def calculateAngle(u, v) 。
c = dot(u, v) / norm(u) / norm(v) # -> 角度的余弦。
angle = arccos(clip(c, -1, 1) # 如果你真的想要這個角度的話
return c, angle
def calc_with_numpy()。
print("方法2:")
v = (u1_norm u2_norm)
c1, angle1 = calculateAngle(u1, v)
c2, angle2 = calculateAngle(u2, v)
print("angle1:"/span>, angle1)
print("angle2:", angle2)
def calc_with_spectral() 。
print("方法1:")
v = (u1_norm u2_norm)
img=np.array([v]).reshape((1,1, v.size))
means = np.array([u1, u2])
angles = spectral.spectral_angles(img, means)
print("angle1:", angles[0,0, 0] )
print("angle2:", angles[0, 0, 1] )
u1 = array([1.0,2.0], dtype="float64")
u1_norm = u1 / sum(u1)
u2 = array([3.0,2.0], dtype="float64"/span>)
u2_norm = u2 / sum(u2)
calc_with_spectral()
calc_with_numpy()
我的結果:
方法1:
angle1: 0.25518239062081866
angle2: 0.2639637236257044
方法2:
angle1: 0.2551823906208191
angle2: 0.2639637236257044
uj5u.com熱心網友回復:
你在這里是錯誤的
u1_norm = u1 / sum(u1)
u2_norm = u2 / sum(u2)
為了得到歸一化(單位長度)的矢量,你需要用矢量長度除以它的分量,而不是用分量之和(就像你在calculateAngle中執行的正確作業)
u1_norm = u1 / np.linalg.norm(u1)
uj5u.com熱心網友回復:
只需改變以下代碼
u1_norm = u1 / sum(u1)
u2_norm = u2 / sum(u2)
by
u1_norm = u1 / len(u1)
u2_norm = u2 / len(u2)
uj5u.com熱心網友回復:
你的規范化是錯誤的。相反,請做
u1_norm = u1 / np.sqrt(np.sum(u1**2)
u2_norm = u2 / np.sqrt(np.sum(u2**2)
我現在得到
>>> calc_with_numpy()
angle1: 0.2595730571232615
angle2: 0.2595730571232615
>>> norm(u1) == np.sqrt(np.sum(u1** 2)
True
>>> norm(u2) == np.sqrt(np.sum(u2**2)
True。
我不知道spectral是什么,我的python發行版沒有它的模塊。
uj5u.com熱心網友回復:
這個函式可以用來計算與二維矢量[x, y]的X軸的角度(度):
from math import atan2, pi
def angle(vec)。
return atan2(*reversed(vec)) * 180 / pi
現在,如果你想計算兩個向量之間的角度,你可以使用這個函式:
def angle_between_vecs(vec1, vec2)。
return abs(angle(vec1) - angle(vec2))
你可能還想計算兩個向量的總和:
def sum_vecs(vec1, vec2)。
return [vec1[0] vec2[0], vec1[1] vec2[1] ]
現在注意,angle(sum_vecs(vec1, vec2))不一定等于angle_between_vecs(vec1, vec2)。請看下面這個圖形例子(vec3是vec1和vec2之和)。正如你所看到的,這個和并不完全是將角度分成兩部分。

這段代碼顯然可以通過使用例如NumPy來優化,但這只是一個例子,告訴你,你關于和的角度應該在兩個向量之間的假設是錯誤的!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/326847.html
標籤:
上一篇:從同一范圍生成兩個亂數的最快方法
