我有一个2D特征数组,其中数组中的每个项目都是一个3元素特征向量(例如表面上的速度场)。
我想将2D数组的每个元素与3元素的Eigen RowVector相乘,从而有效地获取点积。
Eigen::Array<Eigen::Vector3d, Eigen::Dynamic, Eigen::Dynamic> velField(5, 5);
Eigen::Vector3d n;
// ... initialisation of n and velField not shown
Eigen::Array<double, Eigen::Dynamic, Eigen::Dynamic> result(5, 5);
result = n.transpose() * velField;
这给出了编译错误,您混合了不同的数字类型。但是,如果我不分配结果,只需计算它:
n.transpose() * velField;
它编译。 “结果”的正确返回类型是什么 - 或者我还能如何解决这个问题?
修改
在这个更简单的情况下可以观察到同样的问题(乘以一倍):
Eigen::Array<Eigen::Vector3d, Eigen::Dynamic, Eigen::Dynamic> velField(5, 5);
// ... initialisation of velField not shown
Eigen::Array<Eigen::Vector3d, Eigen::Dynamic, Eigen::Dynamic> result(5, 5);
result = 3.0 * velField;
但是,使用std::complex<double>
代替Eigen::Vector3d
时,相同的代码仍有效:
Eigen::Array<std::complex<double>, Eigen::Dynamic, Eigen::Dynamic> velField(5, 5);
// ... initialisation of velField not shown
Eigen::Array<std::complex<double>, Eigen::Dynamic, Eigen::Dynamic> result(5, 5);
result = 3.0 * velField;
我想知道为什么它适用于std::complex
但不适用于Eigen::Vector3d
。两种类型都使用*
定义运算符double
。
答案 0 :(得分:4)
进一步阅读后,我找到了答案:
根据reference documentation of the matrix class,第一个模板参数_Scalar
为:
_Scalar: matrix_tparam_scalar Numeric type, e.g. float, double, int or std::complex<float>.
User defined sclar types are supported as well.
它链接到此page。它列出了“自定义标量类型”的要求。在上面的示例中,<Vector3d>
的{{3}}丢失了。它无法在Vector3d
中正确实现,因此应该只在Eigen::Matrix
/ Eigen::Array
中存储代表标量的类型。
更新
没有赋值n.transpose() * velField;
的行因懒惰的评估而起作用。这样做也适用(在C ++ 11中):
auto result = n.transpose() * velField;
但它在那时没有进行计算(检查调试器中result
的类型)。只要您使用result
,它就会以与第一个示例相同的方式失败。
答案 1 :(得分:1)
这是不允许的。我建议将velField存储为矩阵,即一维3D矢量数组,然后使用标准线性代数运算符。