我知道犰狳中的稀疏矩阵仍处于初步支持状态。 我在我的量子系统研究中使用了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
是否可以动态释放向量片段:loc
,val
以保存内存,逐个元素?
答案 0 :(得分:2)
这里的答案是使用采用CSC格式的其他稀疏矩阵构造函数,因此您需要修改// calculate loc and val
代码,而不是填充以下三个数组:
values
(长度等于点数)row_indices
(长度等于点数)col_ptrs
(长度等于列数加1)这些点应按values
和row_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
指定给您正在使用的构造函数,如果您还没有这样做的话。