在 Matlab 中转置矩阵和求解线性系统时出现奇怪的数值错误
Strange numerical error when transposing a matrix and solving a linear system in Matlab
我在 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 = x5
但 x0 != 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
我知道这可能不会导致任何实际问题,但我仍然很好奇为什么会发生这种情况。
我怀疑它是解析器以及它如何将矩阵提供给 LAPACK 库例程。例如,在 A'*B
的矩阵乘法情况下,其中 A
和 B
是矩阵,转置操作未明确完成。相反,MATLAB 使用适当的标志调用适当的 BLAS 例程(例如,DGEMM),以便完成等效操作,但可能会导致与您首先明确执行转置时不同的操作顺序。我怀疑您的示例可能就是这种情况,并且转置未明确完成,但标志在后台传递给 LAPACK 库例程以完成数学上等效的操作,但实际操作顺序不同导致答案略有不同。
我在 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 = x5
但 x0 != 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
我知道这可能不会导致任何实际问题,但我仍然很好奇为什么会发生这种情况。
我怀疑它是解析器以及它如何将矩阵提供给 LAPACK 库例程。例如,在 A'*B
的矩阵乘法情况下,其中 A
和 B
是矩阵,转置操作未明确完成。相反,MATLAB 使用适当的标志调用适当的 BLAS 例程(例如,DGEMM),以便完成等效操作,但可能会导致与您首先明确执行转置时不同的操作顺序。我怀疑您的示例可能就是这种情况,并且转置未明确完成,但标志在后台传递给 LAPACK 库例程以完成数学上等效的操作,但实际操作顺序不同导致答案略有不同。