C++ 在C+中对同一个大型稀疏矩阵执行多次乘法+;

C++ 在C+中对同一个大型稀疏矩阵执行多次乘法+;,c++,linear-algebra,numerical-methods,C++,Linear Algebra,Numerical Methods,我有一个迭代算法,需要在每次迭代中将一个向量乘以一个巨大的稀疏矩阵a。矩阵A占用数GB的内存,是预先给定的,永远不会更改。(如果有帮助,你可以假设我的算法是求解Ax=b的共轭梯度法。) 因为矩阵A永远不会改变,我想一定有一些技巧可以让我非常有效地执行乘法。例如,我可以将A硬编码到代码中,以便编译器在执行编译时知道A的确切稀疏模式和值吗?我认为,如果编译器知道a的稀疏模式,它将能够做得更好 在这种情况下,可以使用什么技巧以非常快的速度乘以向量 顺便说一下,我目前正在使用Egeng3矩阵库。将非零索

我有一个迭代算法,需要在每次迭代中将一个向量乘以一个巨大的稀疏矩阵a。矩阵A占用数GB的内存,是预先给定的,永远不会更改。(如果有帮助,你可以假设我的算法是求解Ax=b的共轭梯度法。)

因为矩阵A永远不会改变,我想一定有一些技巧可以让我非常有效地执行乘法。例如,我可以将A硬编码到代码中,以便编译器在执行编译时知道A的确切稀疏模式和值吗?我认为,如果编译器知道a的稀疏模式,它将能够做得更好

在这种情况下,可以使用什么技巧以非常快的速度乘以向量


顺便说一下,我目前正在使用Egeng3矩阵库。

将非零索引缓存到数组中?@javaLover您能详细说明一下吗?你这里的“缓存”到底是什么意思?“A”是稀疏的=大量的零。乘法Ax只需要涉及“A”的非零元素。如果非零索引的列表是预先缓存的,那么我们只能将列表中某些元素在“x”中的列表进行倍数运算,得到“Ax”的结果。。。。不确定……试着用纸和铅笔画一个真正的稀疏矩阵“a”,可能会给你一些想法。哦,好的,谢谢。我已经在使用稀疏矩阵向量乘法算法(它是eigen3库的一部分),它只适用于a的非零项。我想这就是你所建议的。如果这个矩阵是“稀疏的”和几GB,它有多大?100000×10000?