作为一个实验,我只是想看看 Cayley-Hamilton 理论和 MATLABinv()
函数之间的计算时间。由于矩阵产品的数量,我知道 CH 在 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));
感谢任何花时间回答的人。