【发布时间】:2025-12-01 04:05:02
【问题描述】:
作为一个实验,我只是想看看 Cayley-Hamilton 理论和 MATLAB inv() 函数之间的计算时间。由于矩阵产品的数量,我知道 C-H 在 CPU 上会更慢,但我没想到随着 N 的增加它们会给我不同的答案。
对于小于 30 * 30 左右的方阵,逆矩阵大致相同。但是在这一点之后,它们开始彼此之间发生很大的不同。到 N = 100 时,它们完全没有相似之处。
这是一个数值计算问题,还是这里发生了其他事情?
还有我可以信任哪个?我假设inv() 是高度优化且值得信赖的,但如果能得到其他人的一些意见,那就太好了。
代码如下:
n = 100;
A = randn(n);
% MATLAB inv()
tic;
initime = cputime;
time1 = clock;
A_inv = inv(A);
fintime = cputime;
elapsed = toc;
time2 = clock;
fprintf('TIC TOC: %g\n', elapsed);
fprintf('CPUTIME: %g\n', fintime - initime);
fprintf('CLOCK: %g\n', etime(time2, time1));
% Cayley-Hamilton inversion
tic;
initime = cputime;
time1 = clock;
p_coeff = poly(A);
A_inv_2 = 0;
for ii = 1:n-1
A_inv_2 = A^(ii)*p_coeff(end-1-ii) + A_inv_2;
end
A_inv_2 = 1/-p_coeff(end) * (A_inv_2 + eye(n)*p_coeff(end-1));
fintime = cputime;
elapsed = toc;
time2 = clock;
fprintf('TIC TOC: %g\n', elapsed);
fprintf('CPUTIME: %g\n', fintime - initime);
fprintf('CLOCK: %g\n', etime(time2, time1));
感谢任何花时间回答的人。
【问题讨论】:
-
如果我没记错的话,以数值稳定的方式计算特征多项式是很棘手的。所以我怀疑 poly() 是负责的。然而,这只是一个猜测。我正在投票,希望比我更有知识的人回答这个问题。
-
我打赌数字问题作为解释。我记得 Noble 和 Daniel 的 Applied Linear Algebra 一书总是坚持不应该实现自己的逆运算,因为它们必然会遇到数值问题。有很多优化可以避免这些问题,
inv毫无疑问有这些优化。至于您可以信任哪个:inv,当然。在您的示例中比较imagesc(A*A_inv)和imagesc(A*A_inv_2)
标签: algorithm matlab matrix inversion