映射Eigen复制矩阵

时间:2017-03-16 09:02:40

标签: c++ matlab eigen replicate

我正在尝试将代码从Matlab引入C ++。有一些与我的案例有关的信息in the KDE Eigen Forums

我尝试实现的是与Matlab的meshgrid有关,为此我们给出了解决方案

X = RowVectorXd::LinSpaced(1,3,3).replicate(5,1);
Y = VectorXd::LinSpaced(10,14,5).replicate(1,3);

即,.replicate向量是另一个维度的数量。在我的情况下,我有两个现有(n x 1)向量,并希望创建一个(n ^ 2,2)矩阵,其中包含向量元素的所有组合,即:

[1 3 6]^T and [7 8]^T ==> [1 7, 3 7, 6 7, 1 8, 3 8, 6 8]^T

其中^T仅表示转置,行以逗号分隔。 (在我的例子中,向量使用浮点数,但这不重要)。

矩阵[1 3 6 1 3 6]^T的第一列很容易由Eigen的.replicate函数创建。但是,我很难创建第二列[7 7 7 8 8 8]^T

我的想法是在另一个维度中使用.replicate(获取矩阵),然后使用rowWise Eigen::Map将其带到线性(矢量)视图(如建议in the docs ),但我理解产生的编译器错误,Eigen::Map不适用于Eigen::Replicate类型。

#include <Eigen/Core>
using namespace Eigen;
int main()
{
    MatrixXd reptest1(1, 5);
    reptest1 << 1, 2, 3, 4, 5;
    auto result2 = reptest1.replicate(2, 1); // cols, rows: 5, 2
    auto result3 = Map<Matrix<double, 1, Dynamic, Eigen::RowMajor> >(result2);  // this doesn't work
return 0;
}

VS2017抱怨:error C2440: '<function-style-cast>': cannot convert from 'Eigen::Replicate<Derived,-1,-1>' to 'Eigen::Map<Eigen::Matrix<double,1,-1,1,1,-1>,0,Eigen::Stride<0,0>>' 海湾合作委员会也抱怨。 no matching function for call(无法复制和粘贴其他计算机上的确切消息)。

我这样做太复杂了吗?应该使用Map工作吗?

1 个答案:

答案 0 :(得分:2)

Map只能处理矩阵,而不能处理表达式。因此,请auto result2替换MatrixXd result2,然后您就完成了。请参阅common pitfalls