C++ 特征库::如何从现有稀疏矩阵中创建块对角稀疏矩阵?

C++ 特征库::如何从现有稀疏矩阵中创建块对角稀疏矩阵?,c++,matrix,linear-algebra,sparse-matrix,eigen,C++,Matrix,Linear Algebra,Sparse Matrix,Eigen,我有一堆(n*n)大小的稀疏矩阵,叫做M1,M2,乔丹 我想创建一个大的块对角稀疏矩阵,如下所示: |M1 0 0 . . . | |0 M2 0 . . . | |. . . . . . | |. . . Mj-1 0| |0 0 0 ... Mj| 我尝试了以下方法: Eigen::SparseMatrix<double> MatBLK(j*n,j*n); MatBLK.reserve(Eigen::Vec

我有一堆(n*n)大小的稀疏矩阵,叫做M1,M2,乔丹

我想创建一个大的块对角稀疏矩阵,如下所示:

    |M1 0  0 . . . |
    |0  M2 0 . . . |
    |.  .  . . . . |
    |.  .  . Mj-1 0|
    |0  0  0 ... Mj|
我尝试了以下方法:

    Eigen::SparseMatrix<double> MatBLK(j*n,j*n);
    MatBLK.reserve(Eigen::VectorXd::Constant(j*n,3); 
    //I know that there are at most 3 nonzero elements per row

    MatBLK.topLeftCorner(n,n) = M1.topLeftCorner(n,n);
    MatBLK.block(n,n,n,n) = M2.topLeftCorner(n,n);
    .
    .
    MatBLK(bottomRightCorner(n,n)) = Mj.topLeftCorner(n,n);
    MatBLK.makeCompressed();
返回0


我不熟悉这个图书馆。非常感谢您的帮助。

不幸的是,由于生成的代码效率很低,您似乎无法以这种方式分配稀疏矩阵。这篇论坛帖子已经发布了将近2年了,但事情似乎还是一样()

您必须通过直接赋值或三元组一个接一个地分配条目

A.block(i,j,m,n) = B;
变成

for (int ii = i; ii < i+m; ++ii) {
  for (int jj = j; jj < j+n; ++jj) {
    // direct assignment 
    A.insert(ii, jj) = B(ii - i, jj - j);

    // triplets
    triplets.push_back(Triplet(ii, jj, B(ii-i,jj-j)));
  }
}
for(int-ii=i;ii
它甚至没有为我编译。我不认为稀疏的
块可以位于
=
的左侧。
for (int ii = i; ii < i+m; ++ii) {
  for (int jj = j; jj < j+n; ++jj) {
    // direct assignment 
    A.insert(ii, jj) = B(ii - i, jj - j);

    // triplets
    triplets.push_back(Triplet(ii, jj, B(ii-i,jj-j)));
  }
}