C++ C+中的变换向量数组+;特征库

C++ C+中的变换向量数组+;特征库,c++,eigen,C++,Eigen,在开始学习数学库时,我遇到了一个非常简单的问题:使用四元数变换一系列向量。似乎我所做的一切都导致找不到运算符*,或者将数组与矩阵混合 Eigen::Quaternionf rot = …; Eigen::Array3Xf series = …; // expected this to work as matrix() returns a Transformation: series.matrix().colwise() *= rot.matrix(); // expected these t

在开始学习数学库时,我遇到了一个非常简单的问题:使用四元数变换一系列向量。似乎我所做的一切都导致找不到
运算符*
,或者将数组与矩阵混合

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

这可能是一个非常直截了当但有效的解决方案:

for (int vector = 0; vector < series.cols(); ++vector)
   series.col(vector) = rot * series.col(vector).matrix();
for(int vector=0;vector

这里的要点是,在某个地方,必须有人阅读您的代码。一个简单的
for
循环通常是最容易理解的。。。不确定为什么在示例中使用数组。我猜你想通过旋转变换M3向量,对吗?你可以用一个3毫米的矩阵

怎么样

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

series = rot.toRotationMatrix() * series;
使用名称空间特征;
四元数f rot=。。。;
矩阵级数=。。。;
系列=旋转旋转矩阵()*系列;

我就是这么做的。我不觉得这比我第一次尝试的东西更容易阅读。谢谢<代码>数组
对于示例中未显示的一些矢量标量加法很方便。但是
Array
是错误的,对象实际上是一个矩阵。将其类型设置为这样并调用
.array()
而不是
.matrix()
修复了该问题。奇怪的是,从
.matrix()
返回的结果不一样……但不管怎样。我刚刚意识到我打算使用
.toRotationMatrix()
而不是
.matrix()
。我认为这里不需要数组。我编辑了原始答案。我认为
series*=rot足够了…看起来我的代码使用了从
Quaternionf
Matrix3f
的隐式转换。