Armadillo 稀疏矩阵大小(以字节为单位)

Armadillo Sparse Matrix Size in Bytes

我想评估 Armadillo 稀疏矩阵有多大。这个问题与关于稠密矩阵有关。

考虑以下示例:

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 在密集矩阵的情况下,不是 return 矩阵本身的大小,而是指针或其他一些小 object 的大小.稀疏矩阵的大小不应简单地是 non-zero 元素的数量乘以数据类型的大小。 Armadillo 以压缩格式存储稀疏矩阵。在单元格值之上,还应该有一个矩阵或向量存储单元格索引。我猜矩阵也有一个 header 存储关于 object.

的信息

三个关键属性:

  • n_rows
  • n_cols 和
  • n_nonzero

最后一个值表示有值的cells 0 <= n_nonzero <= (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序列化:

分配的实际字节数将大致与 n_nonzero 相关,但您必须考虑 /some/ 开销。在实践中,衡量 实际 分配的最佳方法是使用检测分配器,或(该想法的逻辑扩展)内存分析器。参见例如