作爲一個實驗,我只想看看Cayley-Hamilton理論和MATLAB inv()
函數之間的計算時間。由於矩陣產品的數量,我知道C-H在CPU上會更慢,但是我並沒有期待他們在N增加時給我不同的答案。爲什麼我得到兩個不同的反矩陣對於在N中增加的N * 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()是一個負責任的人。但是,這只是一個猜測。我希望有人比我更有知識能夠回答這個問題。 – Ash
我以數字問題作爲解釋下注。我記得諾布爾和丹尼爾的「應用線性代數」一書堅持認爲你不應該實現你自己的逆過程,因爲它們肯定會遇到數值問題。爲避免這些問題需要進行很多優化,而'inv'無疑具有這些優化。至於你可以信任的:當然是'inv'。在你的例子中比較'imagesc(A * A_inv)'和'imagesc(A * A_inv_2)' –