我正在尝试将代码从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工作吗?
答案 0 :(得分:2)
Map
只能处理矩阵,而不能处理表达式。因此,请auto result2
替换MatrixXd result2
,然后您就完成了。请参阅common pitfalls。