我有两个特征矩阵,我想将它们连接起来,就像在 matlab 中一样 cat(0, A, B)
在 eigen 中是否有类似的功能?
谢谢。
MatrixXd C(A.rows(), A.cols()+B.cols());
C << A, B;
竖直方向:
// eigen uses provided dimensions in declaration to determine
// concatenation direction
MatrixXd D(A.rows()+B.rows(), A.cols()); // <-- D(A.rows() + B.rows(), ...)
D << A, B; // <-- syntax is the same for vertical and horizontal concatenation
为了更易读,人们可能会使用空格来格式化垂直连接:
D << A,
B; // <-- But this is for readability only.
concatenate
/hstack
/vstack
一样,或者用逗号初始化器,我不介意,尽管numpy的方式在许多矩阵库中都被使用)。 - Ela782hstack/vstack
涵盖的用法略有不同于逗号初始化程序,我认为这将是一个受欢迎的功能。如果我没记错的话,某个地方悬挂着一些概念验证代码... - ggael我有一个稍微不同的用例:将一个std::vector的Eigen矩阵垂直堆叠。以下是我实现的一个更通用的函数。如果这可以进一步改进,请告诉我:
// matrix_eig = Eigen::MatrixXf in RowMajor format
matrix_eig VStack(const std::vector<matrix_eig> &mat_vec) {
assert(!mat_vec.empty());
long num_cols = mat_vec[0].cols();
size_t num_rows = 0;
for (size_t mat_idx = 0; mat_idx < mat_vec.size(); ++mat_idx) {
assert(mat_vec[mat_idx].cols() == num_cols);
num_rows += mat_vec[mat_idx].rows();
}
matrix_eig vstacked_mat(num_rows, num_cols);
size_t row_offset = 0;
for (size_t mat_idx = 0; mat_idx < mat_vec.size(); ++mat_idx) {
long cur_rows = mat_vec[mat_idx].rows();
vstacked_mat.middleRows(row_offset, cur_rows) = mat_vec[mat_idx];
row_offset += cur_rows;
}
return vstacked_mat;
}