【问题标题】:Block operations on Sparse Matrices- Eigen Toolbox- C++稀疏矩阵上的块操作- Eigen Toolbox- C++
【发布时间】:2016-02-01 06:48:21
【问题描述】:
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 中的一个块分配给临时矩阵中的一个块。临时矩阵的打印输出为零。如果我在概念上遗漏了什么,谁能帮助我。最近的文档说块操作可用于稀疏矩阵。

【问题讨论】:

    标签: c++ sparse-matrix eigen


    【解决方案1】:

    Eigen 中的稀疏矩阵块并非都是可写的。某些是(例如列主矩阵中的.col(Index)),但通用.block(Index, Index, Index, Index) 不是。 documentation 在这件事上相当令人困惑,但如果你仔细观察,所有的例子都是密集矩阵而不是稀疏矩阵。 col() 文档也使用了密集矩阵示例,但如果您尝试一下,您会发现它有效。

    【讨论】:

    • 是的,完全正确...块分配操作目前在稀疏矩阵中不可用。但我可以看到在稀疏矩阵中块提取是可能的......我的意思是 .block() 只能作为右值。如果我可以以最优化的方式修改头文件中的某些内容,任何帮助..
    • 对于稀疏矩阵,插入可能会很昂贵,尤其是跨列主矩阵中的行时(不仅仅是一个内存预留)。缺少左值实现可能是为了防止人们编写低效(但易于编写)的代码。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2018-01-19
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多