我有一个大小为(4x4)的齐次变换矩阵和一个大小为(nx3)的轨迹。该轨迹的每一行都是一个向量。
我想将齐次变换矩阵乘以轨迹的每一行。以下是代码:
#append zero column at last
trajectory = np.hstack((trajectory, np.zeros((trajectory.shape[0], 1)))) #(nx3)->(nx4)
trajectory_new = np.zeros((1, 3)) #(1x3)
for row in trajectory:
vect = row.reshape((-1,1)) #convert (1x4) to (4x1)
vect = np.dot(HTM, vect) #(4x4) x (4x1) = (4x1)
vect = vect.T #(1x4)
vect = np.delete(vect, -1, axis=1) #remove last element from vector
trajectory_new = np.vstack((trajectory_new, vect)) #(nx3)
trajectory_new = np.delete(trajectory_new, 0, axis=0)#remove first row
上述代码可以正常运行。不过,我正在寻找更简单的解决方案,如下所示:
trajectory_new = np.apply_along_axis(np.multiply, 0, trajectory, HTM)
任何帮助,请。
答案:
trajectory = np.hstack((trajectory, np.ones((trajectory.shape[0], 1))))#(nx3)->(nx4)
trajectory_new = trajectory.dot(HTM.T)[:,:-1]
这篇帖子
中所示。 - Divakarx
、y
和z
方向上的位置。最后一个零是为了使计算变得可能。HTM
是(4x4)的矩阵,而trajectory
在添加了零列之后是(4x1)的矩阵。现在的乘法计算是HTM
xtrajectory
,也就是(4x4) x (4x1) = (4x1)。 - ravinp.delete(vect, -1, axis=1) #从向量中删除最后一个元素
并没有利用它的功能。这就是为什么我评论的重点是我们不需要在开头堆叠零的原因。 - DivakarHTM[:,:3]
是不正确的。HTM
和HTM[:3,:]
是正确的。 - ravi