我在 matlab 中有两个稀疏矩阵
M1大小为9000x180万,M2大小为180万x1.8百万。
现在我需要计算表达式
M1/M2
我花了大约一个小时。正常吗?matlab 中是否有任何有效的方法,以便我可以克服这个时间问题。我的意思是它很多,如果我进行多次迭代,那么它将继续需要 1 小时。有什么建议吗?
基于假设使用共轭梯度或 Kaczmarz 方法等迭代方法的快速粗略计算,并插入大小让我相信一个小时还不错。
由于矩阵的三对角性被"反转"(如果不是显式的),这两种方法都将采用接近"一些近乎统一的标量因子"乘以~9000乘以1.8e6乘以"收敛所需的迭代次数"的指令。 引号中这两件事的乘积可能在 50(最小值)到 1000(最大值)左右。 我没有挑选这些来让你的数学工作,这些是关于我对完成这些的期望。 如果您假设每秒大约 1e9 条指令(这不会占用太多内存访问等),则大约需要 13 分钟到大约 4.5 小时。
因此,对于利用稀疏性的算法来说,它似乎在正确的范围内。
如果您了解结构,自己可能会更好地利用它,但可能不会太多。
请注意,这并不是说 13 分钟是可以实现的。
编辑:一个旁注,我不确定正在使用什么,但我假设了迭代方法。 也可以使用直接方法(如此处所述)。 如果您利用稀疏性权利,这些方法对于稀疏系统可能非常有效。 Matlab 很可能默认使用这些,但值得研究一下 Matlab 在您的情况下正在做什么。
根据我有限的经验,迭代方法通常比直接方法更受欢迎,因为系统的大小变大(你的很大)。 我们的线性系统也被计算为块状三对角线,就像它们在图像处理中经常做的那样。