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":
我的实现(COO格式):时间7.95s
,内存317668kB
犰狳(CSC格式):时间5.32s
,记忆715000kB
是否可以动态释放向量片段:loc
、val
以逐个元素地节省内存?
这里的答案是使用其他采用 CSC 格式的稀疏矩阵构造函数,因此您需要修改 // calculate loc and val
代码,而不是填充以下三个数组:
values
(长度等于点数)
row_indices
(长度等于点数)
col_ptrs
(长度等于列数加一)
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 的 "Batch constructors" 部分;这是该列表中的第四个条目。
如果您不能轻易地修改您的计算代码以符合该格式,那么您最好尝试将 sort_locations = false
指定给您正在使用的构造函数,如果您还没有这样做的话。
我知道犰狳中的稀疏矩阵还在初步支持中。 我在我的量子系统研究中使用犰狳库,但我无法以有效的 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":
我的实现(COO格式):时间
7.95s
,内存317668kB
犰狳(CSC格式):时间
5.32s
,记忆715000kB
是否可以动态释放向量片段:loc
、val
以逐个元素地节省内存?
这里的答案是使用其他采用 CSC 格式的稀疏矩阵构造函数,因此您需要修改 // calculate loc and val
代码,而不是填充以下三个数组:
values
(长度等于点数)row_indices
(长度等于点数)col_ptrs
(长度等于列数加一)
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 的 "Batch constructors" 部分;这是该列表中的第四个条目。
如果您不能轻易地修改您的计算代码以符合该格式,那么您最好尝试将 sort_locations = false
指定给您正在使用的构造函数,如果您还没有这样做的话。