【发布时间】: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 = 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
我知道这可能不会导致任何实际问题,但我仍然很好奇为什么会发生这种情况。
【问题讨论】:
-
更奇怪的是:
A0'\b不仅与A1\b不同,还与ctranspose(A0)\b或transpose(A0)\b不同(后三者相等) -
我的猜测:Matlab 的解释器很聪明,将
A0'\b替换为(b'/A0)'(对于非复数也是如此;我没有测试复数)。为什么会这样做?因为转置两个向量比转置矩阵要快。为什么结果会不同?因为\和/可能使用不同的算法,导致不同的、小的数值误差。 Matlab 解释器真的应用了这种优化吗?也许,见this
标签: matlab numeric linear-equation