C++ 特征值如何沿特定维度连接矩阵?
我有两个特征矩阵,我想把它们串联起来,就像在matlabC++ 特征值如何沿特定维度连接矩阵?,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
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;