我有很多大的(大约5000 x 5000)矩阵,我需要在Matlab中反转。我实际上需要逆,所以我不能使用mldivide,这对于解决Ax = b只需要一个b来快得多。
我的矩阵来自一个问题,这意味着他们有一些不错的属性。首先,他们的决定因素是1,所以他们肯定是可逆的。但它们不是可对角化的,或者我会尝试对它们进行对角化,将它们反转,然后将它们放回去。他们的条目都是实数(实际上是理性的)。
我正在使用Matlab来获取这些矩阵,对于这些东西,我需要对它们的反转进行处理,所以我更喜欢一种方法来加速Matlab。但是,如果有另一种语言,我可以使用它会更快,那么请让我知道。我不知道很多其他语言(一点点但只有C和一点点但是Java),所以如果它在其他语言中真的很复杂,那么我可能无法使用它。不过,请继续提出建议,以防万一。
答案 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形式真的很昂贵,这可能对你没有帮助。