我需要解线性系统
A x = b这可以通过以下方式有效地完成
x = A \ b但是现在A非常大,我实际上只需要一个组件,比如说x(1)。有没有比计算x的所有组件更有效的方法来解决这个问题?
A不是稀疏的。在这里,效率实际上是一个问题,因为许多b都是这样做的。
此外,存储K的倒数并仅将其第一行与b相乘是不可能的,因为K的条件很糟糕。在这种情况下,使用\运算符将使用低密度脂蛋白求解器,当显式使用反向运算符时,精度会降低。
发布于 2018-05-31 09:45:00
通常表示为\的mldivide方法接受一次解决具有相同A的多个系统。
x = A\[b1 b2 b3 b4] # where bi are vectors with n rows为每个b求解系统,并将返回一个nx4矩阵,其中每一列都是每个b的解。像这样调用mldivide应该会提高效率,因为分解只进行一次。
因为在许多分解中,比如LU od LDL‘(在你特别感兴趣的分解中),矩阵乘以x是上对角线,第一个要求解的值是x(n)。然而,必须进行LDL的分解,一个简单的向后替换算法不会成为代码的瓶颈。因此,可以保存分解,以避免对每个bi重复计算。因此,代码如下所示:
[LA,DA] = ldl(A);
DA = sparse(DA);
% LA = sparse(LA); %LA can also be converted to sparse matrix
% loop over bi
xi = LA'\(DA\(LA\bi));
% end loop正如您在mldivide (Algorithms section)的文档中看到的,它对输入矩阵执行一些检查,并且将LA定义为full,将DA定义为sparse,它应该直接使用三角形求解器和三对角线求解器。如果LA转换为稀疏,它也会使用三角形求解器,我不知道转换为稀疏是否会有任何改进。
发布于 2018-05-31 08:12:36
我认为从技术上讲,你不会得到一个非常优化的Matlab例程的加速,但是,如果你理解它是如何求解的,那么你可以只求解x的一部分。例如,在传统的求解器中,你可以使用following.来求解QR。在逻辑单元求解中,你同时使用后部子函数和前部子函数。我可以得到LU。不幸的是,由于它解决问题的方式,它实际上是从最后开始的。对于同时使用这两种方法的低密度脂蛋白也是如此。这并不排除可能有更有效的方法来解决你所拥有的一切。
function [Q,R] = qrcgs(A)
%Classical Gram Schmidt for an m x n matrix
[m,n] = size(A);
% Generates the Q, R matrices
Q = zeros(m,n);
R = zeros(n,n);
for k = 1:n
% Assign the vector for normalization
w = A(:,k);
for j=1:k-1
% Gets R entries
R(j,k) = Q(:,j)'*w;
end
for j = 1:k-1
% Subtracts off orthogonal projections
w = w-R(j,k)*Q(:,j);
end
% Normalize
R(k,k) = norm(w);
Q(:,k) = w./R(k,k);
end
end
function x = backsub(R,b)
% Backsub for upper triangular matrix.
[m,n] = size(R);
p = min(m,n);
x = zeros(n,1);
for i=p:-1:1
% Look from bottom, assign to vector
r = b(i);
for j=(i+1):p
% Subtract off the difference
r = r-R(i,j)*x(j);
end
x(i) = r/R(i,i);
end
endhttps://stackoverflow.com/questions/50613928
复制相似问题