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

时间:2016-06-15 20:16:00

标签: c++ sparse-matrix ram armadillo

我知道犰狳中的稀疏矩阵仍处于初步支持状态。 我在我的量子系统研究中使用了armadillo lib,我有问题以有效的RAM方式构造稀疏垫。

到目前为止,我使用自己的稀疏矩阵实现,但我希望有一个优化的矩阵类。

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

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和"填充时间":

  • 我的实施(COO格式):时间7.95s,记忆317668kB

  • 犰狳(CSC格式):时间5.32s,记忆715000kB

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

1 个答案:

答案 0 :(得分:2)

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

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

这些点应按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的“批处理构造函数”部分;这是该列表中的第四个条目。

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