特征库:如何从现有的稀疏矩阵创建块对角线稀疏矩阵?

Eigen Library:: How do I create a block diagonal sparse matrix out of existing sparse matrices?(特征库:如何从现有的稀疏矩阵创建块对角线稀疏矩阵?)
本文介绍了特征库:如何从现有的稀疏矩阵创建块对角线稀疏矩阵?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一组(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。

我是这个图书馆的新人。如有任何帮助,将不胜感激。

推荐答案

遗憾的是,由于生成的代码效率很低,您看起来不能以这种方式分配稀疏矩阵。这篇论坛帖子差不多两年了,但看起来事情还是一样的(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)));
  }
}

这篇关于特征库:如何从现有的稀疏矩阵创建块对角线稀疏矩阵?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Boost module machine type #39;X86#39; conflicts with target machine type #39;x64#39;(Boost模块计算机类型#39;x86#39;与目标计算机类型#39;x64#39;)
Trouble running LLVM examples(运行LLVM示例时出现问题)
Linker error while linking some windows APIs(链接某些Windows API时出现链接器错误)
Python ctypes, C++ object destruction(Python ctype,C++对象销毁)
DllGetClassObject return amp;quot;No such interface supportedamp;quot; while CoCreateInstance can find it successful(DllGetClassObject返回amp;不支持这样的接口,而CoCreateInstance发现它成功了)
Is static_castamp;lt;doubleamp;gt;(std::nanf(amp;quot;amp;quot;)) well defined?(Static_castamp;lt;doubleamp;gt;(std::nanf(amp;quot;amp;quot;))是否定义良好?)