向量特征数组的向量运算

时间:2014-03-21 00:28:24

标签: c++ linear-algebra eigen

我有一个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

2 个答案:

答案 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矢量数组,然后使用标准线性代数运算符。