如何在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分解矩阵应该比原始系统快得多。这是一个很好的基本答案。但是,我不会尝试它,因为正如您所说,它很可能仍然比内置方法慢。