特征如何沿特定维度连接矩阵?

Ran*_*Ran 37 c++ eigen

我有两个特征矩阵,我想连接它们,就像在matlab中一样 cat(0, A, B)

在本征中有什么相同的东西吗?

谢谢.

gga*_*ael 55

您可以使用逗号初始化程序语法.

水平:

MatrixXd C(A.rows(), A.cols()+B.cols());
C << A, B;
Run Code Online (Sandbox Code Playgroud)

垂直:

// 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
Run Code Online (Sandbox Code Playgroud)

为了便于阅读,可以使用空格格式化垂直连接:

D << A,
     B; // <-- But this is for readability only. 
Run Code Online (Sandbox Code Playgroud)

  • 是的,你猜对了.(它不是基于代码格式化!) (16认同)
  • Eigen如何确定是垂直还是水平连接矩阵?它是基于输出矩阵的大小? (3认同)

thc*_*ark 6

我会以类似于这篇文章(连接到现有矩阵)的方式使用Eigen 的块索引

块索引避免了公认方法中的方向歧义,并且是非常紧凑的语法。以下相当于C = cat(2, A, B)在 MATLAB 中:

MatrixXd C(A.rows(), A.cols()+B.cols());
C.leftCols(A.cols()) = A;
C.rightCols(B.cols()) = B;
Run Code Online (Sandbox Code Playgroud)


tan*_*ngy 5

我有一个稍微不同的用例:垂直堆叠特征矩阵的 std::vector。这是我如何实现一个更通用的功能。让我知道这是否可以进一步改进:

// 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;
}
Run Code Online (Sandbox Code Playgroud)