如何在MATLAB中求解一个只含一个分量的线性系统
我需要解线性系统如何在MATLAB中求解一个只含一个分量的线性系统,matlab,linear-algebra,equation-solving,Matlab,Linear Algebra,Equation Solving,我需要解线性系统 A x = b 这可以通过 x = A \ b 但是现在A非常大,实际上我只需要一个组件,比如x(1)。有没有比计算x的所有组件更有效的方法来解决这个问题 A不是稀疏的。在这里,效率实际上是一个问题,因为这是为许多b所做的 此外,存储K的倒数并仅将其第一行乘以b也是不可能的,因为K的条件很差。在这种情况下,使用\操作符使用LDL解算器,当显式使用逆运算时,精度会降低。我认为从技术上讲,在非常优化的Matlab例程中,你不会得到一个加速。但是,如果你理解它是如何求解的,那么你
A x = b
这可以通过
x = A \ b
但是现在A
非常大,实际上我只需要一个组件,比如x(1)
。有没有比计算x
的所有组件更有效的方法来解决这个问题
A
不是稀疏的。在这里,效率实际上是一个问题,因为这是为许多b
所做的
此外,存储
K
的倒数并仅将其第一行乘以b
也是不可能的,因为K
的条件很差。在这种情况下,使用\
操作符使用LDL解算器,当显式使用逆运算时,精度会降低。我认为从技术上讲,在非常优化的Matlab例程中,你不会得到一个加速。但是,如果你理解它是如何求解的,那么你可以只解x的一部分。例如,在传统解算器中,您使用backsub进行QR解算。在LU解算中,你同时使用后潜艇和前潜艇。我可以得到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
end
通常表示为\
的方法可以同时使用相同的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()的文档中所看到的,它对输入矩阵执行一些检查,并将
LA
定义为full,将DA
定义为sparse,它应该直接用于三角形解算器和三对角解算器。如果LA
被转换为稀疏,它也会使用一个三角形解算器,我不知道转换为稀疏是否代表任何改进。存储因子分解很有意义。我以前确实在另一个环境中做过,但现在想不起来了。感谢您的提醒。很高兴能提供帮助,关键是“根据输入矩阵使用许多不同的解算器,如算法部分所述,因此将mldivide应用于alredy分解矩阵应该比原始系统快得多。这是一个很好的基本答案。但是,我不会尝试它,因为正如您所说,它很可能仍然比内置方法慢。