【问题标题】:Strange numerical error when transposing a matrix and solving a linear system in Matlab在 Matlab 中转置矩阵和求解线性系统时出现奇怪的数值错误
【发布时间】:2022-01-13 21:05:18
【问题描述】:

我偶然发现了 MATLAB 中相当奇怪的行为。求解线性方程组的运算符 \ 有时会产生不同的结果,但唯一改变的是转置运算符的位置。

看看这个例子:

A0 = rand(4);
b = rand(4,1);
A1 = A0';
x0 = A0\b;
x1 = A1'\b;
x2 = linsolve(A0,b);
x3 = linsolve(A1',b);
x4 = mldivide(A0,b);
x5 = mldivide(A1',b);

x0 = x2 = x3 = x4 = x5x0 != x1(它们的大小相差 10^-15)

上面例子中的A0是:

   0.781931966588002   0.530872257027928   0.112283962156027   0.964422667215901
   0.100606322362422   0.091498731339412   0.784427890743913   0.432484993970361
   0.294066333758628   0.405315419880591   0.291570317906931   0.694752194617940
   0.237373019705579   0.104846247115757   0.603533438750887   0.758099275289454

b 是:

   0.432642326147101
   0.655498039803537
   0.109755050723052
   0.933759848385332

我知道这可能不会导致任何实际问题,但我仍然很好奇为什么会发生这种情况。

【问题讨论】:

  • 更奇怪的是:A0'\b不仅与A1\b不同,还与ctranspose(A0)\btranspose(A0)\b不同(后三者相等)
  • 我的猜测:Matlab 的解释器很聪明,将 A0'\b 替换为 (b'/A0)'(对于非复数也是如此;我没有测试复数)。为什么会这样做?因为转置两个向量比转置矩阵要快。为什么结果会不同?因为\/ 可能使用不同的算法,导致不同的、小的数值误差。 Matlab 解释器真的应用了这种优化吗?也许,见this

标签: matlab numeric linear-equation


【解决方案1】:

我怀疑它是解析器以及它如何将矩阵提供给 LAPACK 库例程。例如,在 A'*B 的矩阵乘法中,AB 是矩阵,转置操作没有明确完成。相反,MATLAB 使用适当的标志调用适当的 BLAS 例程(例如,DGEMM),以便完成等效的操作,但可能会导致与您先显式完成转置的操作顺序不同。我怀疑您的示例可能就是这种情况,并且转置没有明确完成,但标志在后台传递给 LAPACK 库例程以完成数学上等效的操作,但实际操作顺序不同导致答案略有不同。

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多