特征库::如何从现有的稀疏矩阵中创建一个块对角线稀疏矩阵
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。
我是这个库的新手。任何帮助将不胜感激。
不幸的是,由于所得代码的效率低下,看起来您无法以这种方式分配稀疏矩阵。该论坛帖子已有快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)));
}
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '