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)));
}
}
这篇关于特征库:如何从现有的稀疏矩阵创建块对角线稀疏矩阵?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
织梦狗教程
本文标题为:特征库:如何从现有的稀疏矩阵创建块对角线稀疏矩阵?
基础教程推荐
猜你喜欢
- CString 到 char* 2021-01-01
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 初始化列表*参数*评估顺序 2021-01-01
