【问题标题】:Eigen how to concatenate matrix along a specific dimension?特征如何沿特定维度连接矩阵?
【发布时间】:2014-02-25 02:20:09
【问题描述】:

我有两个特征矩阵,我想将它们连接起来,比如在 matlab cat(0, A, B)

本征中有什么等价的吗?

谢谢。

【问题讨论】:

  • 那个matlab代码不起作用。

标签: c++ eigen


【解决方案1】:

您可以为此使用逗号初始化语法。

水平方向:

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. 

【讨论】:

  • Eigen 如何判断是垂直连接矩阵还是水平连接矩阵?是根据输出矩阵的大小吗?
  • 是的,你猜对了。 (不是基于代码格式的!)
  • 还没有用于稀疏矩阵。
  • @ggael 我认为这种“猜测”不是很直观。这不是很明确,它也需要相当多的“信任”才能真正做到“正确的事情”。更明确地处理这个不是更好吗? (它可能像 numpy 的 concatenate/hstack/vstack 或逗号初始化器,我不介意,虽然 numpy 方式用于许多矩阵库)。
  • @Ela782 在 A.rows() == A.cols()+B.cols() 的情况下(即如果允许转置,矩阵可以水平或垂直堆叠)然后矩阵不会被转置。因此堆叠 3 个 Vector3d 将垂直堆叠它们,因为向量是 Eigen 中的单列矩阵。堆叠正方形矩阵的顺序与使用运算符
【解决方案2】:

我有一个稍微不同的用例:垂直堆叠特征矩阵的 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;
}

【讨论】:

【解决方案3】:

我会以类似于this post(连接到现有矩阵)的方式使用Eigen's block indexing

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

MatrixXd C(A.rows(), A.cols()+B.cols());
C.leftCols(A.cols()) = A;
C.rightCols(B.cols()) = B;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    相关资源
    最近更新 更多