我不完全确定如何描述这个,但基本上我试图找到两个矢量之间的角度在xy平面的圆圈中四处走动。为了做到这一点,我采用一个矢量,称为vec,它是质心(圆心)之间的向量
cm
和圈子上的任意位置。
pt
然后我找到了相应的切线向量。
tvec
我使用它和z-dir向量来表示向量的切平面。
A
我也有一个3维特征向量,用于圆圈中的特定点。然后我将特征向量投影到切平面上并测量投影向量之间的角度
proj
和切线向量。我还希望角度范围仅在-90到90之间。这是我写的代码:
def helical_angle(i, j, cm, e1):
pt = np.array([[i,j,0]])
vec = pt - cm
zvec = np.array([[0,0,1]])
tvec = (np.cross(vec, [0.,0,1]))
A = np.concatenate((tvec,zvec))
''' need A to be in terms of tvec, zvec column vectors'''
A = A.T
'''e1 = eigenvector for i,j'''
'''proj to execute equation proj = A(A.T * A) ^(-1) *A.T * e1 '''
proj_1 = np.linalg.pinv(np.dot(A.T, A))
proj_2 = np.dot(A, proj_1)
proj_3 = np.dot(proj_2, A.T)
proj = np.dot(proj_3, e1.T)
proj = proj.T
''' get back as row vector'''
ha = np.arccos(np.vdot(tvec, proj)/ (np.sqrt(np.vdot(tvec,tvec)) * np.sqrt(np.vdot(proj, proj))))
ha_deg = np.rad2deg(ha)
cross_check = np.cross(tvec,proj)
dot_check = np.vdot(cross_check,vec)
if ha_deg > 90:
ha_deg = ha_deg - 180
if dot_check > 0:
ha_deg = -ha_deg
''' check which vector is above or below'''
return ha_deg
for i in range (0,192):
for j in range (0,192):
e1 = tenfit.evecs[i,j,slicedim,:,0]
if FA[i,j,slicedim] < 0.2:
continue
ha_array[i,j] = helical_angle(i,j,cm,e1)
除了当我打印出ha_array的图像时,圆圈的左右两边都有倒置的符号(通常,当j的幅度大于i的幅度,但并非总是而不是那么清晰时)所以如果积极的话应该是消极的。我已经尝试了浏览每个单独的组件,并且在逐个打印时它们都有意义。有没有特别有线性代数经验的人知道为什么会出错?我唯一能想到的是投射出现了一些问题,但我不知道是什么。