C++ Eigen库中如何转换向量数组

4

开始使用Eigen数学库时,我在一个非常简单的任务上遇到了困难:使用四元数转换一系列向量。似乎我所做的一切都导致没有找到operator*,或者将数组与矩阵混合。

Eigen::Quaternionf rot = …;
Eigen::Array3Xf series = …;

// expected this to work as matrix() returns a Transformation:
series.matrix().colwise() *= rot.matrix();

// expected these to work as it's standard notation:
series = rot.matrix() * series.matrix().colwise();
series = rot.toRotationMatrix() * series.matrix().colwise();

// Also tried adding .homogeneous() as one example used it… no dice
2个回答

5

嗯...我不确定为什么你在示例中使用了一个数组。我猜你想通过rot来转换m个三维向量,对吧?你可以使用一个3xm的矩阵来实现。

这样怎么样?

using namespace Eigen;
Quaternionf rot = ...;
Matrix<float,3,Dynamic> series = ...;

series = rot.toRotationMatrix() * series;

1
谢谢!Array在一些未在示例中显示的向量标量加法中很方便。但是,Array是错误的,对象实际上是一个矩阵。将其类型设置为矩阵并调用.array()而不是.matrix()解决了问题。奇怪的是,从.matrix()返回的结果没有以相同的方式工作...但无论如何。 - Potatoswatter
我刚刚意识到我应该使用.toRotationMatrix()而不是.matrix()。我认为这里不需要使用数组。我已经编辑了原始答案。 - Jakob
我认为 series *= rot; 就足够了... 这似乎是我的代码使用了从 QuaternionfMatrix3f 的隐式转换。 - Potatoswatter

0
这可能是一个非常直接而有效的解决方案:
for (int vector = 0; vector < series.cols(); ++vector)
   series.col(vector) = rot * series.col(vector).matrix();

这里的重点是,总有人需要阅读你的代码。一个简单的 for 循环通常是最容易理解的。

1
这正是我所做的。我觉得这并不比我之前尝试过的更容易阅读。 - Potatoswatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接