我想在现有矩阵的内存上定义一个四元数。让这个矩阵成为
MatrixXd M(4,4);举个例子。我希望我的四元数被映射到第二列上。通常我会这么做
Map<Quaterniond> q (&M(0,1));如果M是列-专业,这将工作,因为Map将是列.
现在假设我有第二个数组N,现在是行主数组。
Matrix<double, -1, -1, RowMajor> N(4,4);现在我映射的四元数
Map<Quaterniond> q (&N(0,1));这是错误的:q的元素将从N行开始,也就是说,N(0,1),N(0,2),N(0,3),N(1,0)。
对于向量,我有可能指定Stride,例如,如果我希望在M和N的第二列上映射一个4x1向量,那么下面两行就会产生有效的结果:
Map<const VectorXs, 0, Stride<-1, -1> > vc(&M(0,1), 4, 1, Stride<-1, -1>(M.colStride(),M.rowStride()));
Map<const VectorXs, 0, Stride<-1, -1> > vr(&N(0,1), 4, 1, Stride<-1, -1>(N.colStride(),N.rowStride()));我试图将Stride技术用于Map<Quaternion>,但没有成功。事实上,从特征文档来看,这似乎是不可能的。
问题如下:
Stride中可以使用Map<Quaternion>吗?多么?Quaternion对象之外,我还有什么解决办法或替代方法?发布于 2019-08-28 07:40:01
到目前为止,这是不可能的。这可能不会太难实现,我在相关特征请求上添加了一个简短的注释,这将直接允许编写N.row(i).asQuaternion()。
目前,您可以在矩阵和四元数之间来回复制,这通常非常便宜,甚至可能比处理指针和步长对象更便宜:
Eigen::Matrix4Xd M; // input/output matrix
// extract quaternion from M
Eigen::Quaterniond q(M.row(1).transpose());
// ... do something with q
// copy back quaternion
M.row(1) = q.coeffs().transpose(); // transposing not necessary (would be done implicitly)如果M在编译时没有4列,您可能需要中间的Eigen::Vector4d对象,或者将该行复制到现有的Eigen::Quaterniond对象中,也就是说,在这种情况下,这些替代方法可以工作(复制回原样):
// If M.row(1) is not known at compile time to have 4 elements:
Eigen::Quaterniond q(Eigen::Vector4d(M.row(1)));
q.coeffs() = M.row(1); // copy row into an existing quaternionhttps://stackoverflow.com/questions/57677624
复制相似问题