稀疏矩阵的块操作- Eigen工具箱- C++

4
Block operations for sparse matrices - Eigen Toolbox - C++ 


#include "Eigen/Dense"
#include "Eigen/Sparse"
#include <iostream>
using namespace std;
using namespace Eigen;

    int main()
    {
    MatrixXd silly(6, 3);
    silly << 0, 1, 2,
            0, 3, 0,
            2, 0, 0,
            3, 2, 1,
            0, 1, 0,
            2, 0, 0;

        SparseMatrix<double> sparse_silly,temp;
        sparse_silly= Eigen::SparseMatrix<double>(6, 3);
        temp = Eigen::SparseMatrix<double>(6, 3);
        sparse_silly = silly.sparseView();

        std::cout << "Whole Matrix" << std::endl;
        std::cout << sparse_silly << std::endl;



         temp.block(0, 0, 2, 2)=sparse_silly.block(0, 0, 2, 2);

        std::cout << "block of matrix" << std::endl;
        std::cout << temp.block(0, 0, 2, 2) << std::endl;

        getchar();
        return 0;
    }

在上面的代码中,使用Eigen工具箱时稀疏矩阵的块操作无法正常工作。我想将一个sparse_silly中的块分配给temp矩阵中的一个块。输出打印的temp矩阵为零。如果我在概念上遗漏了什么,有人能帮助我吗?最近的文档说稀疏矩阵有块操作。
1个回答

5
在Eigen中,稀疏矩阵块并非全部可写。某些矩阵块是可写的(例如列主要矩阵中的.col(Index)),但通用的.block(Index, Index, Index, Index)则不行。关于这一点,文档相当令人困惑,但如果你仔细观察,所有的例子都是针对密集矩阵而不是稀疏矩阵的。 col() 的文档也使用了一个密集矩阵的例子,但如果你尝试一下,就会发现它确实可以工作。

是的,目前在稀疏矩阵中不支持块赋值操作。但我可以看到,在稀疏矩阵中块提取是可能的...我的意思是.block()只能作为右值。如果我能以最优化的方式修改头文件,是否有任何帮助? - Mani Ratnam
使用稀疏矩阵时,插入操作可能会很昂贵,特别是在列主要矩阵中跨行进行操作(不仅仅是内存的一个保留)。缺乏lvalue实现可能是有意为之,以防止人们编写低效(但易于编写)的代码。 - Avi Ginsburg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接