【问题标题】:Armadillo Sparse Matrix Size in Bytes犰狳稀疏矩阵大小(以字节为单位)
【发布时间】:2021-12-29 13:49:38
【问题描述】:

我想评估犰狳稀疏矩阵有多大。这个问题与这个answer 有关密集矩阵有关。

考虑以下示例:

void some_function(unsigned int matrix_size) {
  arma::sp_mat x(matrix_size, matrix_size);

  // Steps entering some non-zero values

  std::cout << sizeof(x) << std::endl;
}

不幸的是,sizeof 与密集矩阵的情况一样,不返回矩阵本身的大小,而是返回指针或其他一些小对象的大小。稀疏矩阵的大小不应简单地是非零元素的数量乘以数据类型的大小。 Armadillo 以压缩格式存储稀疏矩阵。在单元格值之上,还应该有一个矩阵或向量来存储单元格索引。而且我猜这个矩阵也有一个存储对象信息的标题。

【问题讨论】:

  • 除非犰狳提供一些函数来做你想做的事,否则没有标准的 C++ 函数来获取稀疏矩阵使用的存储总量。

标签: c++ c++11 sizeof armadillo rcpparmadillo


【解决方案1】:

共有三个关键属性:

  • n_rows
  • n_cols 和
  • n_nonzero

最后一个值表示有值的cells 0 &lt;= n_nonzero &lt;= (n_rows*n_cols)的个数。

您可以使用它来了解密度(也可以使用.print 显示为百分比,例如

[matrix size: 3x3; n_nonzero: 4; density: 44.44%]

     (1, 0)         0.2505
     (0, 1)         0.9467
     (0, 2)         0.2513
     (2, 2)         0.5206

我之前使用这些属性来实现sp_matrix序列化:How to serialize sparse matrix in Armadillo and use with mpi implementation of boost?

实际分配的字节数与n_nonzero 大致相关,但您必须考虑/some/ 开销。在实践中,测量实际分配的最佳方法是使用插桩分配器,或(该想法的逻辑扩展)内存分析器。参见例如How to find the memory occupied by a boost::dynamic_bitset?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多