在解决您的疑问之前,必须备注。当您想使用速记运算符转置矩阵时...您不应使用',而应使用.'。第一个是conjugate transpose 的速记运算符,而第二个是transpose 的正确速记运算符。虽然它们通常会产生相同的结果,但将前者与包含复数的矩阵一起使用可能会打乱您的计算。
由于您没有提供数据样本,以下是我为测试部署的设置:
Y = [2; 4];
A = [3 1; 7 1];
现在,让我们一步一步来。对于您的第一个答案,是的,从数学角度来看,这两个操作是等效的,并且产生基本相同的结果:
>> B = A \ Y
B =
0.5
0.5
-----------------------------
>> B = inv(A.' * A) * A.' * Y
B =
0.500000000000001
0.5
您看到的细微差别是因为INV(A) * b 不如A \ b 准确,如果您将调用悬停在inv 函数后跟一个乘法(应该用橙色警告突出显示):
这也部分回答了您的第二个问题,但让我们做一个详尽的基准测试。我放弃了使用inv(A.' * A) * A.' * Y 执行的计算,因为建议避免它。我们开始:
tic();
for i = 1:100000
B = A \ Y;
end
toc();
tic();
for i = 1:100000
B = pinv(A) * Y;
end
toc();
tic();
for i = 1:100000
B = (A.' * A) \ A.' * Y;
end
toc();
这是基准测试的结果:
Elapsed time is 0.187067 seconds.
Elapsed time is 2.987651 seconds.
Elapsed time is 2.173117 seconds.
鉴于这三种方法具有相同的准确性...第一种方法是迄今为止最快的一种。