将 3 个矩阵相乘的智能方法

计算科学 线性代数 矩阵 布拉斯 密集矩阵
2021-12-17 04:49:08

我有一个量子力学模拟,我需要将三个矩阵相乘,如下所示:

ρ(t1)=Uρ(t0)U

在哪里U是厄米特共轭U. 这演变了密度矩阵ρ从一个时间点到另一个时间点。U称为进化算子。

我的问题是:有没有一种聪明的方法可以减少在 C++ 中进行矩阵乘法所需的时间?有什么比使用 BLAS 的zgemm2 次(或zhemm2 次,因为矩阵是 Hermitian)更好的吗?


附加信息:

我对 smart 的意思不仅是使用不同的库,而且还要找到一种方法来在数学上或计算上减少必须在该操作中完成的乘法次数。

我处理的矩阵的大小范围从27215边长(所有这些矩阵都是方阵)。

2个回答

您是否考虑过使用 Cholesky(或低秩)因子ρ(t0)而不是矩阵本身?这可能会减少您需要制作的产品数量,并且它具有在您的计算中保持正半定性的额外好处。

如果我没有在成本上犯错的话,单独使用 Cholesky 因子进行计算已经更便宜了:让n是出现在此处的每个矩阵的一侧;计算上三角 Cholesky 因子R这样ρ(t0)=RR费用13n3(以传统模型计算加法=乘法=1);计算RU费用n3(因为R是三角形的)和计算(RU)(RU)费用n3(因为您只需要计算一半的条目)。OTOH,计算Uρ(t0)费用2n3,然后计算一半的条目(Uρ(t0))U费用n3.

如果ρ(t0)等级低(在我研究量子力学时看到的示例中,初始状态经常发生),那么可以从矩形开始R来自其低秩因子的 QR 而不是 Cholesky 分解,这种方法甚至更便宜。如果在这个三元积之后您必须对矩阵进行更多计算,那么可能会节省额外的费用:例如,为了计算积和求解线性系统,您可以直接使用低秩因子,而不是形成最后一个积。

仅考虑计算的观点,您可以考虑使用 cuBLAS ,即 BLAS 的 CUDA 版本。

链接是一个使用示例。在最后一部分中,有一个 C++ 示例,带有推力