gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:40:42 26 4
gpt4 key购买 nike

我知道 Armadillo 中的稀疏矩阵还在初步支持中。我在我的量子系统研究中使用 Armadillo 库,但我在以有效的 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

  • Armadillo (CSC格式):时间5.32s,内存715000kB

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

最佳答案

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

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

valuesrow_indices vector 中的点应按列优先顺序排列,col_ptrs vector 包含非零元素的数量列开头之前的元素。也就是说,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 指定给您正在使用的构造函数,如果您还没有这样做的话.

关于c++ - Armadillo:高效的 RAM 稀疏批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37844956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com