我正在用Matlab对大矩阵进行正交化处理,但我发现函数orth比qr慢得多,例如:
>> a = randn(200000, 80);
tic; orth(a); toc;
Elapsed time is 2.472516 seconds.
>> tic; qr(a); toc;
Elapsed time is 0.610215 seconds.
什么原因导致了如此大的差异?
看起来 qr
确实是更快的方法。
从逻辑上讲,这意味着它必须有一个缺点,否则 Matlab 不会继续使用这种较慢的方法。
你主要想注意的两件事:
虽然可能还有其他原因导致现在实现 orth
的方式,但我猜其中之一就是这些。
附言:您可能还想查看这个简单的Gram Schmidt解决方案以供比较。
orth
不变的另一个原因是,这样任何使用它的旧代码仍然能够产生完全相同的结果。 - horchler
orth
可能使用 SVD,而qr
则使用 Gram-Schmidt(或其他立方算法),但我不太自信将其发布为答案。 - David Eisenstatorth
函数确实使用了 SVD,这可以从其代码中看出。qr
是一个内置函数,所以你的猜测还有待确认。 - Luis Mendo