Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Floating point 哪种方法计算矩阵向量积A B u的精度更高?_Floating Point_Linear Algebra_Matrix Multiplication_Numerical Analysis_Significant Digits - Fatal编程技术网

Floating point 哪种方法计算矩阵向量积A B u的精度更高?

Floating point 哪种方法计算矩阵向量积A B u的精度更高?,floating-point,linear-algebra,matrix-multiplication,numerical-analysis,significant-digits,Floating Point,Linear Algebra,Matrix Multiplication,Numerical Analysis,Significant Digits,我想计算向量 s=A B u 其中s和u是N维复向量,A是N×M复矩阵,B是M×N复矩阵。当A、B和u的元素表示为浮点数时,以下哪两种方法具有更好的精度(更高的有效数字) (1) 首先计算bu 首先做矩阵向量乘法 y=bu 然后,另一个矩阵向量乘法 s=A y (2) 首先计算A B 首先做矩阵乘法 C=AB 然后,矩阵向量乘法 s=CU 有什么已知的一般规则吗 顺便说一句,我知道方法(1)比方法(2)更有效。矩阵向量乘法比矩阵乘法具有更好的数值稳定性,因此我希望方法(1)更精确 更详细地说,矩

我想计算向量

s=A B u

其中s和u是N维复向量,A是N×M复矩阵,B是M×N复矩阵。当A、B和u的元素表示为浮点数时,以下哪两种方法具有更好的精度(更高的有效数字)

(1) 首先计算bu

首先做矩阵向量乘法

y=bu

然后,另一个矩阵向量乘法

s=A y

(2) 首先计算A B

首先做矩阵乘法

C=AB

然后,矩阵向量乘法

s=CU

有什么已知的一般规则吗


顺便说一句,我知道方法(1)比方法(2)更有效。

矩阵向量乘法比矩阵乘法具有更好的数值稳定性,因此我希望方法(1)更精确

更详细地说,矩阵向量乘法具有良好的前向和后向误差界。如果我们以矩阵向量乘法y=bu为例,那么y中的误差为2n乘以单位舍入(使用标准双精度数时为1e-16)乘以矩阵B中的最大数乘以向量u中的最大数。这是正向错误界限

后向误差界是,计算出的y不精确地是B和u的乘积,但它精确地是稍微不同的矩阵B'和向量u的乘积。B和B'之间的差值以2n乘以单位舍入乘以矩阵B中的最大数为界

对于矩阵乘法,有一个类似于矩阵向量乘法的前向误差界,但没有很好的后向误差界

这是一个一般原则:输出较少的计算(如矩阵向量乘法)比输出较多的计算(如矩阵计算)更可能向后稳定

然而,这是否有任何区别是另一个矩阵。可能是方法(2)恢复了向后稳定性,因为矩阵向量积跟随矩阵积。也可能是对于您的特定应用程序,没有太大差异,或者甚至方法(2)实际上更准确

但是,考虑到方法(1)肯定是更快的方法,也可能是更准确的方法,我肯定会选择这种方法

新增于2011年9月29日:我最喜欢的资料来源是Nicholas J.Higham,《数值算法的准确性和稳定性》,SIAM,2002年。但是许多数值分析的教科书都讨论了正向和反向误差分析,特别是那些专注于线性代数的书

正向误差是相当直观的。如果你知道B和u是正确的,那么你感兴趣的是计算出的乘积bu和精确乘积之间的差异;这就是正向误差分析告诉您的。当矩阵B不正确时,反向误差起作用(可能是早期计算产生的结果,也可能最终来自实验或建模误差的测量)。假设B中的误差为1e-10,乘法中的后向误差小于此值,例如1e-11。这意味着,虽然乘法的结果对于你给算法的B是不正确的,但是对于另一个矩阵B是正确的,它非常接近原始的B,所以它很可能是正确的B,就像你给算法的B一样。所以从某种意义上说,这是你所希望的


前向误差分析和后向误差分析有不同的优点:有时一种适用,有时另一种适用,有时混合使用。理想情况下,算法应具有良好的前向和后向误差界限,但这种情况并不经常发生。

除非算法专门设计用于进行额外工作以补偿数值不准确,否则一个很好的经验法则是,给定两种方法来计算同一事物,做更少工作的算法具有更好的准确性(毕竟,产生舍入的机会更少)。这并不是普遍正确的,所以这并不能免除思考这些事情的义务,但这是一个很好的起点


在你的情况下,它恰好是正确的。在不预先知道矩阵中特定值的情况下,应首选方法(1)。(可以构造方法(2)更精确的特定情况,但它们通常都是精心设计的)。

不同的乘法算法可能具有不同的精确度。你问题的答案是否取决于乘法所采用的算法(以及可能的
A
B
u
本身)?谢谢你的回答,吉特。很高兴知道方法(1)可能更准确。我想知道更多关于前向和后向错误界限的信息,如果您能提供一些涉及这个主题的参考资料,我将非常高兴。在我看来,正向误差界与我认为的数值精度直接相关,但我不确定是否需要反向误差界。另外,我觉得在方法(2)中,一旦一个有效数字在矩阵乘法中丢失,它就不能在随后的矩阵向量乘法中恢复。@norio I添加了一点向后错误,因为这确实不是那么直观。很可能你是对的,重要数字一旦丢失将无法恢复,但我不能说任何更确切的话(这是作为一名数学家的问题!)。吉特,感谢你提供有关反向错误分析的参考和详细解释。斯蒂芬,感谢你的回答。我