在地图中使用 Stride<Quaternion>
Using Stride in Map<Quaternion>
我想在现有矩阵的内存之上定义一个四元数。令此矩阵为
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 向量,则以下两行会产生有效结果,无论它们是 row- 还是 col- major:
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>
但没有成功。其实从eigen documentation看来,这是不可能的。
问题是:
- 是否可以在
Map<Quaternion>
中使用Stride
?怎么样?
- 如果不是,为什么这不可能?
- 除了将数据复制到新的
Quaternion
对象之外,我还有什么解决方法或替代方法?
到目前为止,这是不可能的。这可能不太难实现,我在 related feature request 上添加了一个简短的注释,这将直接允许编写 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 quaternion
我想在现有矩阵的内存之上定义一个四元数。令此矩阵为
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 向量,则以下两行会产生有效结果,无论它们是 row- 还是 col- major:
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>
但没有成功。其实从eigen documentation看来,这是不可能的。
问题是:
- 是否可以在
Map<Quaternion>
中使用Stride
?怎么样? - 如果不是,为什么这不可能?
- 除了将数据复制到新的
Quaternion
对象之外,我还有什么解决方法或替代方法?
到目前为止,这是不可能的。这可能不太难实现,我在 related feature request 上添加了一个简短的注释,这将直接允许编写 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 quaternion