矩阵向量乘法比矩阵矩阵乘法具有更好的数值稳定性,所以我希望方法(1)更准确。
更详细地说,矩阵向量乘法具有很好的前向和后向误差界限。如果我们以矩阵向量乘法 y = B u 为例,那么 y 的误差为单位舍入的 2n 倍(使用标准双精度数时为 1e-16)乘以矩阵中的最大数 B 倍向量 u 中的最大数。这是前向误差界。
后向误差界是计算出的 y 不是 B 和 u 的乘积,而是一个稍微不同的矩阵 B' 和向量 u 的乘积。B 和 B' 之间的差值以 2n 倍单位舍入乘以矩阵 B 中的最大值为界。
对于矩阵-矩阵乘法,有一个类似于矩阵-向量乘法的前向误差界,但没有很好的后向误差界。
这是一个一般原则:输出较少的计算(例如矩阵-向量乘法)比输出较多的计算(例如矩阵-矩阵计算)更可能是向后稳定的。
但是,这是否有任何区别是另一个矩阵。可能是方法(2)恢复了后向稳定性,因为矩阵-向量乘积跟随矩阵-矩阵乘积。也可能是对于您的特定应用程序,没有太大区别,甚至方法(2)实际上更准确。
但是,鉴于方法(1)肯定是更快的一种,也可能是更准确的一种,我肯定会选择那个选项。
2011 年 9 月 29 日添加:我最喜欢这个主题的来源是 Nicholas J. Higham, Accuracy and Stability of Numerical Algorithms, SIAM, 2002。但是许多数值分析教科书都讨论了前向和后向误差分析,尤其是那些专注于线性代数。
前向误差相当直观。如果您知道 B 和 u 是正确的,那么您感兴趣的是计算得到的乘积 B u 与精确乘积之间的差异;这就是前向错误分析告诉你的。当矩阵 B 不正确时,后向误差就会发挥作用(它可能是早期计算的结果导致了错误,或者它最终来自遭受实验或建模错误的测量)。假设 B 中的误差为 1e-10,并且乘法中的后向误差小于此值,例如 1e-11。这意味着尽管乘法的结果对于您提供给算法的 B 不正确,但对于另一个矩阵 B 是正确的,该矩阵 B 与原始 B 非常接近,以至于它很可能是正确的 B B 你给了算法。
前向和后向误差分析具有不同的优势:有时一种适用,有时另一种适用,有时混合使用。理想情况下,算法应该具有良好的前向和后向误差界限,但这并不经常发生。