【问题标题】:Understanding Matlab linsolve了解 Matlab linsolve
【发布时间】:2014-11-21 06:19:53
【问题描述】:

1.A\b 和 linsolve(A,b) 有什么区别(不同的算法?)?

2.求解A*x=b和A'*A*x=A'*b有什么区别,哪个更精确?

第二个等式来自Least squares approximation

简单的matlab测试代码:

A=[1,2,3;4,5,6;7,8,9]
b=[1;2;3]

x1= A\b
x1 =

   -0.3333
    0.6667
         0
x2=linsolve(A,b)
x2 =

   -0.3333
    0.6667
         0
x3=linsolve(A'*A,A'*b)
x3 =

    0.2487
   -0.4974
    0.5820
x4=(A'*A)\(A'*b)
x4 =

   -0.8182
    1.6364
   -0.4848

阅读 linsolve 文档我发现

[X,R] = linsolve(A,B) 求解矩阵方程 AX = B 并返回 如果 A 是方阵,则 A 的条件数的倒数, 否则为 A 的等级。

所以使用 R 我们可以测试精度(第二个问题)?

【问题讨论】:

  • A'Ax=A'b 是最小二乘近似的正规方程。你永远不会想用 A'*Ax=A'*b 来解决这个问题。使用 x1 = A\b 因为这将使用一些好的和稳定的东西,比如 QR 分解,甚至可能是 SVD。对于条件较差的矩阵,您可以在 A'*A 的计算中引入重大错误,因此不要使用这种方法
  • @mathematician1975 如果我有 A=(M,n) nAI 仅求解 (n,n) 矩阵的方程组时,它应该更快?我在哪里可以找到关于方程 Ax=b 和 A'Ax=A'*b 的信息\证明有相同的答案?另请参阅我关于条件编号/等级的更新。
  • 不需要预乘A'矩阵。方程 A'Ax=A'*b 只是最小二乘系统解的显式方程。您在这里处理的是一个正方形系统,但原则是相同的 - 根本不需要预乘 A',它效率低下,即使在最好的情况下,您也只能希望不要加剧任何不适系统。

标签: matlab linear-algebra equation-solving


【解决方案1】:

关于您的第一个问题:可以将mldivde (x = A\B) 视为linsolve 函数的包装器。函数linsolve 允许用户指定有关矩阵A 的信息,这可以帮助Matlab 选择更合适(更快)的算法来求解系统。然而,使用 linsolve 很容易搞砸。引用自 Matlab 的documentation

如果 A 没有您在 opts 中指定的属性,则 linsolve 会返回不正确的结果并且不会返回错误消息。如果您不确定 A 是否具有指定的属性,请改用 mldivide。

如果您在执行算法时可以 100% 确定地评估矩阵的类型A,那么请选择linsolve。否则使用mldivide

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2012-06-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多