有没有一种快速的方法来反转Matlab中的矩阵?

时间:2011-06-28 15:50:34

标签: algorithm matlab matrix performance matrix-inverse

我有很多大的(大约5000 x 5000)矩阵,我需要在Matlab中反转。我实际上需要逆,所以我不能使用mldivide,这对于解决Ax = b只需要一个b来快得多。

我的矩阵来自一个问题,这意味着他们有一些不错的属性。首先,他们的决定因素是1,所以他们肯定是可逆的。但它们不是可对角化的,或者我会尝试对它们进行对角化,将它们反转,然后将它们放回去。他们的条目都是实数(实际上是理性的)。

我正在使用Matlab来获取这些矩阵,对于这些东西,我需要对它们的反转进行处理,所以我更喜欢一种方法来加速Matlab。但是,如果有另一种语言,我可以使用它会更快,那么请让我知道。我不知道很多其他语言(一点点但只有C和一点点但是Java),所以如果它在其他语言中真的很复杂,那么我可能无法使用它。不过,请继续提出建议,以防万一。

3 个答案:

答案 0 :(得分:19)

  

我实际上需要逆,所以我不能使用mldivide,...

这不是真的,因为你仍然可以使用mldivide得到逆。请注意A-1 = A-1 * I。在MATLAB中,这相当于

invA = A\speye(size(A));

在我的机器上,5000x5000矩阵大约需要10.5秒。请注意,MATLAB确实具有inv函数来计算矩阵的逆矩阵。虽然这将花费大约相同的时间,但在数值准确性方面效率较低(链接中的更多信息)。


  

首先,他们的决定因素是1,所以他们肯定是可逆的

而不是det(A)=1,而condition number of your matrix决定了逆的准确性或稳定性。请注意det(A)=∏i=1:n λi。因此,只需设置λ1=Mλn=1/Mλi≠1,n=1即可获得det(A)=1。但是,如M → ∞cond(A) = M2 → ∞λn → 0,意味着您的矩阵接近奇点,并且在计算逆矩阵时会出现大的数值误差。


  

我的矩阵来自一个问题,这意味着它们有一些不错的属性。

当然,如果您的矩阵稀疏或具有其他有利属性,还可以使用其他更有效的算法。但是没有任何关于你的具体问题的额外信息,没有什么可以说的了。


  

我更喜欢一种加速Matlab的方法

MATLAB使用高斯消元来计算使用mldivide的一般矩阵(完全秩,非稀疏,没有任何特殊属性)的逆矩阵,这是Θ(n3),其中n是矩阵的大小。因此,在您的情况下,n=5000并且有1.25 x 1011个浮点运算。因此,在具有大约10 Gflops计算能力的合理计算机上,您将需要至少12.5秒来计算逆,除非您利用“特殊属性”(如果它们可被利用),则无法解决这个问题。 )

答案 1 :(得分:7)

无论使用何种语言,反转任意5000 x 5000矩阵在计算上都不容易。我建议调查近似值。如果您的矩阵是低等级的,您可能想要尝试低等级近似M = USV'

以下是来自数学溢出的更多想法:

https://mathoverflow.net/search?q=matrix+inversion+approximation

答案 2 :(得分:1)

首先假设特征值都是1。让A成为矩阵的Jordan规范形式。然后,您可以仅使用矩阵乘法和

添加来计算A^{-1}
A^{-1} = I + (I-A) + (I-A)^2 + ... + (I-A)^k

其中k < dim(A)。为什么这样做?因为生成函数很棒。回想一下扩展

(1-x)^{-1} = 1/(1-x) = 1 + x + x^2 + ...

这意味着我们可以使用无限和来反转(1-x)。您想要反转矩阵A,因此您想要

A = I - X

求解X会给X = I-A。因此,通过替换,我们有

A^{-1} = (I - (I-A))^{-1} = 1 + (I-A) + (I-A)^2 + ...

在这里,我刚刚使用了身份矩阵I来代替数字1。现在我们有收敛的问题,但这实际上不是问题。假设A是约旦形式并且所有特征值都等于1,我们知道A是上三角形,对角线上的所有1 s。因此I-A是上三角形,对角线上的所有0 s。因此I-A的所有特征值都是0,因此对于某些x^dim(A),其特征多项式为x^{k+1},其最小多项式为k < dim(A)。由于矩阵满足其最小(和特征)多项式,这意味着(I-A)^{k+1} = 0。因此,上述序列是有限,最大非零项为(I-A)^k。所以它收敛了。

现在,对于一般情况,将矩阵放入Jordan格式,这样就有了一个块三角矩阵,例如:

A 0 0
0 B 0
0 0 C

每个块沿对角线具有单个值。如果a的值为A,则使用上述技巧反转1/a * A,然后再将a相乘。由于全矩阵是块三角形,因此逆是

A^{-1} 0      0
0      B^{-1} 0
0      0      C^{-1}

拥有三个街区并没有什么特别之处,所以无论您拥有多少街区,这都有效。

请注意,只要您拥有Jordan格式的矩阵,此技巧就可以使用。在这种情况下,逆向计算将在Matlab中非常快,因为它只涉及矩阵乘法,你甚至可以使用技巧来提高速度,因为你只需要单个矩阵的幂。但是,如果将矩阵变成Jordan形式真的很昂贵,这可能对你没有帮助。