繁体   English   中英

向量特征数组的向量运算

[英]Vector operations on Eigen Array of Vectors

我有一个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定义operator *

经过进一步阅读,我找到了答案:

根据矩阵类参考文档 ,第一个模板参数_Scalar是:

_Scalar: matrix_tparam_scalar Numeric type, e.g. float, double, int or std::complex<float>.
User defined sclar types are supported as well.

它链接到此页面 它列出了“自定义标量类型”的要求。 在上面的例子中, Eigen::NumTraits<Vector3d> Eigen::NumTraits Vector3d无法正确实现,因此只能在Eigen::Matrix / Eigen::Array存储表示标量的类型。


更新:

没有赋值的行n.transpose() * velField; 因为懒惰的评价而起作用。 这样做也适用(在C ++ 11中):

auto result = n.transpose() * velField;

但它在那时没有进行计算(检查调试器中的result类型)。 一旦使用result ,它将以与第一个示例相同的方式失败。

这是不允许的。 我建议将velField存储为矩阵,即一维3D矢量数组,然后使用标准线性代数运算符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM