假设我有一个大的(但可能稀疏)矩阵A
,它是K-by-K的维数。我有另一个K-by-1载体,b
。只计算矩阵积的必要行
让Ax=b
。如果我只对第一个n
行感兴趣,其中n < K
,x
,那么在MATLAB中处理这个问题的一种方法是计算x=A\b
并采取第一个n
元素。
如果尺寸K
太大以致于整个计算不可行,还有其他方法来获取这些元素吗?
假设我有一个大的(但可能稀疏)矩阵A
,它是K-by-K的维数。我有另一个K-by-1载体,b
。只计算矩阵积的必要行
让Ax=b
。如果我只对第一个n
行感兴趣,其中n < K
,x
,那么在MATLAB中处理这个问题的一种方法是计算x=A\b
并采取第一个n
元素。
如果尺寸K
太大以致于整个计算不可行,还有其他方法来获取这些元素吗?
我想一种方法是重新排列A的列和x的行,以便您感兴趣的元素出现在x的末尾。那么你会将[A,B]减少为梯队形式。最后,为了得到你想要的组件,你需要修改后的A的右下角nxn子矩阵(我们称之为An),然后求解简化系统An * xn = bn,其中xn表示x的潜艇感兴趣,而bn表示行梯队减少后的最后n行。
我的意思是,这里转换成梯队形式仍然很昂贵,但是您不需要为x中的其余组件解决问题,这可以节省您的时间。
只是一个想法:你可以尝试使用分块矩阵求逆:如果您阻止你的矩阵为A = [A11, A12;A21, A22]
,其中A11
是n 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你想适合一个固定的答:
这是一个有趣的问题,但是,我怀疑这是一个比编程问题更多的数学问题。乍一看,我发现[两个](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
谢谢!会看看! – Marco