Eigen - 将向量重塑为矩阵

时间:2021-02-19 16:38:56

标签: c++ reshape eigen

我正在尝试将向量重塑为矩阵,但出现以下错误

unsigned int Nx     = 8;
unsigned int Ny     = 7;
Eigen::VectorXi G_temp = Eigen::VectorXi::LinSpaced((Nx + 2) * (Ny + 2),0,(Nx + 2) * (Ny + 2)-1);
Eigen::MatrixXd G = Eigen::Map<Eigen::MatrixXd>(G_temp.data(),Nx+2, Ny+2); // error: no matching constructor for initialization of 'Eigen::Map<Eigen::MatrixXd>'

我遵循了 here 所写的内容,但我不明白我做错的方式。

1 个答案:

答案 0 :(得分:1)

在 Eigen 中没有从整数值到双值表达式的隐式转换。要么使用 VectorXd 表示 G_temp(和 LinSpaced 表达式):

Eigen::VectorXd G_temp = Eigen::VectorXd::LinSpaced((Nx + 2) * (Ny + 2),0,(Nx + 2) * (Ny + 2)-1);

或者在将结果分配给 MatrixXi 之前使用 .cast<double>()-Map 和 G 结果。

Eigen::MatrixXd G = Eigen::Map<Eigen::MatrixXi>(G_temp.data(),Nx+2, Ny+2).cast<double>();

为了避免任何临时性,您还可以分配一个 MatrixXd 并直接在其中分配适当的值:

Eigen::MatrixXd G(Nx+2, Ny+2); // allocate matrix
// set values in-place:
Eigen::VectorXd::Map(G.data(), (Nx + 2) * (Ny + 2)).setLinSpaced(0,(Nx + 2) * (Ny + 2)-1);

或者使用 master/3.4 分支:

G.reshaped().setLinSpaced(0,(Nx + 2) * (Ny + 2)-1);