动态尺寸矩阵垂直/水平Linspaced?

问题描述 投票:1回答:1

我目前正在一个项目中,我需要能够创建如下矩阵:

MatrixXi lin_spaced_horizontaly = 

0 1 2 3 4 ... ncols
0 1 2 3 4 ... ncols
0 1 2 3 4 ... ncols

MatrixXi lin_spaced_verticaly =
0 0 0 
1 1 1 
2 2 2 
3 3 3 
4 4 4
 . . . 
nrows nrows nrows

目前我正在尝试类似的事情:

Eigen::VectorXi v_lin_vec = Eigen::VectorXi::LinSpaced(nrows_, 0, nrows_).transpose
Eigen::MatrixXi v_lin_matrix (nrows_, ncols_);
for (auto i = 0; i<ncols_; i++)
        v_lin_matrix << v_lin_vec;

Eigen::VectorXi h_lin_vec = Eigen::VectorXi::LinSpaced(ncols_, 0, ncols_)
Eigen::MatrixXi h_lin_matrix (nrows_, ncols_);
for (auto i = 0; i<ncols_; i++)
        h_lin_matrix << h_lin_vec;

而且我得到的结果例如:

v_lin_matrix 
-------------
0 0 0 0 0
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0

h_lin_matrix
-------------
0 0 0 0 0
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0

提前感谢!

eigen linspace
1个回答
0
投票

您可以像这样使用.rowwise().replicate(ncols_).colwise().replicate(nrows_)

Eigen::MatrixXi v_lin_matrix = Eigen::VectorXi::LinSpaced(nrows_, 0, nrows_)
                                     .rowwise().replicate(ncols_);
Eigen::MatrixXi h_lin_matrix = Eigen::RowVectorXi::LinSpaced(ncols_, 0, ncols_)
                                     .colwise().replicate(nrows_);

或替代:

Eigen::MatrixXi v_lin_matrix = Eigen::VectorXi::LinSpaced(nrows_, 0, nrows_)
                                     .replicate(1,ncols_);
Eigen::MatrixXi h_lin_matrix = Eigen::RowVectorXi::LinSpaced(ncols_, 0, ncols_)
                                     .replicate(nrows_,1);

关于<<的使用:它应与,运算符结合使用以在单个表达式中初始化矩阵,如下所示:

 Eigen::MatrixXi A(4,ncols_);
 A << row0, row1, row2, row3;

您编写的内容将在运行时声明(如果您在不使用-DNDEBUG的情况下进行编译,我强烈建议您在代码经过充分测试之前!)

© www.soinside.com 2019 - 2024. All rights reserved.