2017-02-16 93 views
4

假设我有一个大的(但可能稀疏)矩阵A,它是K-by-K的维数。我有另一个K-by-1载体,b只计算矩阵积的必要行

Ax=b。如果我只对第一个n行感兴趣,其中n < K,x,那么在MATLAB中处理这个问题的一种方法是计算x=A\b并采取第一个n元素。

如果尺寸K太大以致于整个计算不可行,还有其他方法来获取这些元素吗?

+3

这是一个有趣的问题,但是,我怀疑这是一个比编程问题更多的数学问题。乍一看,我发现[两个](http://www.sciencedirect.com/science/article/pii/0898122188901721)[论文](https://www.degruyter.com/view/j/rnam.1989.4。问题-6/rnam.1989.4.6.453/rnam.1989.4.6.453.xml)这可能有可能是相关的...可以问数学。也许吧? – dasdingonesin

+0

谢谢!会看看! – Marco

回答

1

我想一种方法是重新排列A的列和x的行,以便您感兴趣的元素出现在x的末尾。那么你会将[A,B]减少为梯队形式。最后,为了得到你想要的组件,你需要修改后的A的右下角nxn子矩阵(我们称之为An),然后求解简化系统An * xn = bn,其中xn表示x的潜艇感兴趣,而bn表示行梯队减少后的最后n行。

我的意思是,这里转换成梯队形式仍然很昂贵,但是您不需要为x中的其余组件解决问题,这可以节省您的时间。

1

只是一个想法:你可以尝试使用分块矩阵求逆:如果您阻止你的矩阵为A = [A11, A12;A21, A22],其中A11n x n,您可以通过Block Matrix Inversion计算其逆B = inv(A) = [B11, B12;B21, B22]的块。它有不同的版本,您可以使用您使用的Schur补充版本的尺寸仅为n x n。我不太确定是否可以避免使用与K一致的反转,但您可以查看它。

您的解决方案是x(1:n) = [B11, B12]*b。它可以帮助您避免计算B21,B22。不过,我不确定这是否值得。取决于我猜测的尺寸。

这里是一个版本,不过这仍然需要的A22倒数是(K-n)x(K-n)

K = 100; 
n = 10; 
A = randn(K,K); 
b = randn(K,1); 
% reference version: full inverse 
xfull = inv(A)*b; 

% blocks of A 
A11 = A(1:n,1:n);A12 = A(1:n,n+1:K);A21 = A(n+1:K,1:n);A22 = A(n+1:K,n+1:K); 
% blocks of inverse 
A22i = inv(A22);    % not sure if this can be avoided 
B11 = inv(A11 - A12*A22i*A21); 
B12 = -B11*A12*A22i; 

% solution 
x_n = [B11,B12]*b; 

disp(x_n - xfull(1:n)) 

编辑:当然,这种计算逆“明确”,因此可能比慢得多只是解决伦敦证券交易所。这可能是值得的,如果你有几个向量b你想适合一个固定的答:

+0

该算法的数学正确名称是[Schur complement](https://en.wikipedia.org/wiki/Schur_complement)。另外,你应该用'm = k-n'将'inv(A22)'替换为'A22 \ eye(m)'。 – romeric

+1

你会注意到我在我的回复中已经提到了“Schur补充”。 ;-)出于好奇:你认为'A22 \ eye(K-n)'比'inv(A22)'快吗?我不知道,但说实话我会有些惊讶。 – Florian