【问题标题】:Eigen Library:: How do I create a block diagonal sparse matrix out of existing sparse matrices?Eigen Library:: 如何从现有的稀疏矩阵中创建块对角稀疏矩阵?
【发布时间】:2015-07-22 00:56:18
【问题描述】:

我有一堆 (n*n) 大小的稀疏矩阵,称为 M1、M2...、Mj。

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

    |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();

此方法无效。较小矩阵中的值不会被复制到较大的块矩阵中。功能:

    MatBLK.nonZeros() 

返回 0。

我是这个图书馆的新手。任何帮助将不胜感激。

【问题讨论】:

  • 它甚至不能为我编译。我不认为稀疏的block 可以在= 的左侧。

标签: c++ matrix linear-algebra sparse-matrix eigen


【解决方案1】:

不幸的是,由于生成的代码效率低下,您似乎无法以这种方式分配稀疏矩阵。这个论坛帖子已经快 2 年了,但似乎还是一样 (https://forum.kde.org/viewtopic.php?f=74&t=112018)

您必须一个一个地分配条目,无论是直接分配还是三元组。

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)));
  }
}

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 2023-03-16
    • 1970-01-01
    • 2018-01-19
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多