Armadillo:高效的 RAM 稀疏批量插入

Armadillo: efficient RAM sparse batch insertion

我知道犰狳中的稀疏矩阵还在初步支持中。 我在我的量子系统研究中使用犰狳库,但我无法以有效的 RAM 方式构建稀疏垫。

到目前为止,我使用的是自己的稀疏矩阵实现,但我想要一个优化矩阵 class。

我正在以批处理模式填充元素:

umat loc(2,size);
cx_vec val(size);

// calculate loc and val
...
//

sp_cx_mat Hamiltonian(loc, val);

这种操作将值从 loc、val 复制到 Hamiltonian 的构造函数,并且在几秒钟内需要 2x RAM。我计算了巨大的矩阵(大小约为 2**L,其中 L=22、24、...),所以我希望我在内存中有经过优化的代码。 为了比较,矩阵大小:705432x705432 - RAM 和 "filling time":

是否可以动态释放向量片段:locval 以逐个元素地节省内存?

这里的答案是使用其他采用 CSC 格式的稀疏矩阵构造函数,因此您需要修改 // calculate loc and val 代码,而不是填充以下三个数组:

  • values(长度等于点数)
  • row_indices(长度等于点数)
  • col_ptrs(长度等于列数加一)

valuesrow_indices向量中的点应按列优先顺序排列,col_ptrs向量包含列开始前非零元素的数量.也就是说,col_ptrs[0] 将始终包含 0,col_ptrs[1] 将包含第一列中非零元素的数量,col_ptrs[2] 将包含第一列和第二列中非零元素的数量,并且col_ptrs[n_cols + 1] 将包含矩阵中非零元素的数量。

有关此构造函数的更多文档,请参阅 http://arma.sourceforge.net/docs.html#SpMat 的 "Batch constructors" 部分;这是该列表中的第四个条目。

如果您不能轻易地修改您的计算代码以符合该格式,那么您最好尝试将 sort_locations = false 指定给您正在使用的构造函数,如果您还没有这样做的话。