【问题标题】:How can I print in console a formatted sparse matrix with eigen?如何在控制台中打印带有特征的格式化稀疏矩阵?
【发布时间】:2023-03-23 06:25:01
【问题描述】:

我正在与 Eigen Eigen 合作。我有一个由一组 Triplet 定义的稀疏矩阵,我想以格式化的方式打印矩阵。我已经看到通过执行 Matrix.format(FORMAT_TYPE) Eigen: IOFormat 可以使用普通矩阵。但我没有找到对稀疏矩阵做同样的方法。我想获得类似 Matlab 矩阵输出的输出。 非常感谢。

【问题讨论】:

  • std::cout << m << "\n";?
  • 是的,但是这些值没有被列在表格中……这可能取决于 Visual Studio 吗?
  • 没有制表是什么意思?它在矩阵之前打印一些其他的东西?如果这就是你的意思,请在发布中运行它,而不是调试。
  • 我得到了这个link,但我想要这个link

标签: eigen


【解决方案1】:

要获得良好的格式,您需要先将其转换为密集矩阵:

SparseMatrix<double> spmat;
...
std::cout << MatrixXd(spmat) << std::endl;

【讨论】:

  • @ggael 那需要分配整个 NxM 矩阵,不是吗?
  • 是的,但通常你只输出相当小的矩阵进行调试
【解决方案2】:

可能对 OP 不再感兴趣,但我是通过 Google 来到这里的,所以其他人可能也会...

直接打印整个稀疏矩阵是不切实际的,因为它们通常很大。 block operator 也适用于稀疏,因此您可以执行以下操作:

int nElements = 10;
std::cout <<
compMat.block( compMat.rows() - nElements, compMat.cols() - nElements, nElements, nElements )
          << std::endl;

打印正方形稀疏矩阵右下角的最后 10 个元素。

在我的机器上,这在释放模式下需要 6 毫秒。

以下代码对大约 35000*35000 个条目的完整矩阵执行相同的操作,但需要约 25000 毫秒...

int nElements = 10;
std::cout <<
Eigen::MatrixXd( compMat ).block( compMat.rows() - nElements, compMat.cols() - nElements, nElements,
                                               nElements )
          << std::endl;

【讨论】:

    猜你喜欢
    • 2013-09-25
    • 2016-10-09
    • 1970-01-01
    • 2019-05-21
    • 2015-08-24
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2018-06-20
    相关资源
    最近更新 更多