Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 特征值如何沿特定维度连接矩阵?_C++_Eigen - Fatal编程技术网

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

C++ 特征值如何沿特定维度连接矩阵?,c++,eigen,C++,Eigen,我有两个特征矩阵,我想把它们串联起来,就像在matlabcat(0,A,B) 在eigen中有什么等价物吗 谢谢。您可以使用逗号初始值设定项语法 横向: MatrixXd C(A.rows(), A.cols()+B.cols()); C << A, B; MatrixXd C(A.rows(),A.cols()+B.cols()); 我有一个稍微不同的用例:垂直堆叠特征矩阵的std::向量。下面是我如何实现一个更通用的函数。让我知道这是否可以进一步改进: // matrix_ei

我有两个特征矩阵,我想把它们串联起来,就像在matlab
cat(0,A,B)

在eigen中有什么等价物吗


谢谢。

您可以使用逗号初始值设定项语法

横向:

MatrixXd C(A.rows(), A.cols()+B.cols());
C << A, B;
MatrixXd C(A.rows(),A.cols()+B.cols());

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

// 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;
}
//矩阵\u eig=Eigen::矩阵xxf,采用RowMajor格式
矩阵VStack(常数标准::向量和矩阵向量){
断言(!mat_vec.empty());
long num_cols=mat_vec[0].cols();
大小\u t数量\u行=0;
对于(大小为0;大小为
我将以类似的方式使用(连接到现有矩阵)

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

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

Eigen如何判断矩阵是垂直连接还是水平连接?它是基于输出矩阵的大小吗?是的,你猜对了。(它不是基于代码格式!)对于稀疏矩阵还不是。@ggael我认为这种“猜测”不是很直观。它不是很明确,而且它还需要相当多的“信任”,即它确实做了“正确的事情”。更明确地处理这个问题不是更好吗?(它可以像numpy的
串联
/
/
/
vstack
或者使用逗号初始值设定项,我不介意,尽管numpy方式在很多矩阵库中都使用)。@Ela782以及在A.rows()==A.cols()+B.cols()的情况下(即,如果允许转置,矩阵可以水平或垂直堆叠)然后矩阵将不会被转置。所以堆叠3个Vector3d将垂直堆叠它们,因为向量在Eigen中是单列矩阵。堆叠方阵的平方数的顺序与使用matlab代码不起作用的运算符将元素插入矩阵的顺序相同。感谢这种动态解决方案,因为矩阵的数目事先未知。但是,要注意stl容器(即向量)和特征值
// 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;
}
MatrixXd C(A.rows(), A.cols()+B.cols());
C.leftCols(A.cols()) = A;
C.rightCols(B.cols()) = B;