我正在尝试将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吗?
Map<RowVectorXd> resultAsCol(result2.data(), result2.size());
看起来可以满足我的需求。我接受你的答案并感谢提供常见陷阱的链接。我之前忽略了这一点,而这是很重要的,因为我通常尽可能地使用 C++11 和 C++14。 - AverageCoder