地图 Eigen 复制矩阵

4

我正在尝试将Matlab代码转换成C++。与我的情况相关的一些信息可以在KDE Eigen论坛中找到。

我试图实现的与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(获得一个矩阵),然后使用Eigen::Map进行逐行映射,将其转换为线性(向量)视图(如文档所建议的)。但是,我理解产生的编译器错误表明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>>' GCC也报错。 no matching function for call(无法复制和粘贴确切的消息,因为它在另一台机器上)。

我做得太复杂了吗?应该使用Map吗?

1个回答

2

Map 只能在矩阵上工作,而不能在表达式上工作。因此,请将 auto result2 替换为 MatrixXd result2,问题就解决了。请参见常见陷阱


谢谢您的超快回答。然而,即使没有自动设置,它也无法工作:MatrixXd result2 = reptest1.replicate(2, 1); // cols, rows: 5, 2 VectorXd result3 = Map<Matrix<double, 1, Dynamic, Eigen::RowMajor> >(result2); - AverageCoder
Map<RowVectorXd> resultAsCol(result2.data(), result2.size()); 看起来可以满足我的需求。我接受你的答案并感谢提供常见陷阱的链接。我之前忽略了这一点,而这是很重要的,因为我通常尽可能地使用 C++11 和 C++14。 - AverageCoder
对,我忽略了这第二个错误。 - ggael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接